我正在尝试使用PyQt5进行Telegram风格的聊天。
我尝试了几种选项来创建类似于聊天的内容,我认为图形最适合此目的。
我有代码,但它看起来不像 Telegram 的聊天内容。请帮我创建它。
主要.py:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, \
QHBoxLayout, QLabel, QTextEdit, QPushButton, QMainWindow, \
QLineEdit, QGraphicsScene, QGraphicsItem, QGraphicsView, \
QGraphicsTextItem, QGraphicsRectItem
from PyQt5.QtCore import Qt
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.initUI() # Инициализирую пользовательский интерфейс
self.current_y = 0 # Переменная для отслеживания текущей высоты
def initUI(self):
self.setWindowTitle("Чат")
self.setGeometry(300, 300, 1200, 700)
central_widget = QWidget(self)
self.setCentralWidget(central_widget)
layout_input_and_send = QHBoxLayout()
layout = QVBoxLayout(central_widget) # создаём вертикальный виджет
layout.addLayout(layout_input_and_send)
# Создаем область графики для чата
self.graphics_view = QGraphicsView(self)
self.graphics_scene = QGraphicsScene(self)
self.graphics_view.setScene(self.graphics_scene)
layout.addWidget(self.graphics_view) # Добавляем QGraphicsView в макет
self.graphics_view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # Отключаем горизонтальную прокрутку
# Поле для ввода
self.input_user_command = QLineEdit(self)
self.input_user_command.setPlaceholderText("Введите текст") # Устанавливаем текст подсказку
layout_input_and_send.addWidget(self.input_user_command) # Расположение объекта
# Кнопка отправки сообщения
self.send_button = QPushButton("Отправить", self)
self.send_button.clicked.connect(self.send_message)
layout_input_and_send.addWidget(self.send_button)
def send_message(self):
message = self.input_user_command.text()
if message: # Проверяем, что сообщение не пустое
print("Сообщение: " + message)
text_item = QGraphicsTextItem(message) # Создаем графический элемент текста
# Устанавливаем размеры фона сообщения
rect_width = 350 # Ширина фона
rect_height = text_item.boundingRect().height() + 10 # Высота фона с отступом
# Создаем прямоугольник для фона сообщения
rect_item = QGraphicsRectItem(0, self.current_y, rect_width, rect_height)
rect_item.setBrush(Qt.lightGray) # Устанавливаем цвет фона (светло-серый)
# Устанавливаем позицию текста так, чтобы он был выровнен по правому краю
text_item.setPos(rect_width - text_item.boundingRect().width() - 5, self.current_y + 5) # Отступ 5 пикселей от правого края
# Добавляем прямоугольник и текст в сцену
self.graphics_scene.addItem(rect_item) # Добавляем фон в сцену
self.graphics_scene.addItem(text_item) # Добавляем текст в сцену
# Обновляем текущую высоту для следующего сообщения
self.current_y += rect_height + 10 # Увеличиваем высоту с учетом отступа
self.input_user_command.clear() # Очищаю поле для ввода
self.graphics_view.verticalScrollBar().setValue(self.graphics_view.verticalScrollBar().maximum()) # Прокручиваем вниз, чтобы показать новое сообщение
def keyPressEvent(self, event):
# Проверяем, была ли нажата клавиша Enter
if self.input_user_command.hasFocus() and event.key() == 16777220: # Код клавиши Enter
self.send_message() # Отправляем сообщение
def main():
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()