使用PyQt创建一个简单的聊天界面

时间:2017-10-12 05:23:16

标签: python pyqt chat

我目前正在创建一个看似普通邮件服务的简单聊天应用程序。我面临的问题是,我只是按下发送按钮就无法在QVBoxLayout上添加更多QLabel。它只是按预期将消息发送到布局,但是当我发送另一条消息而不是附加消息时,它将替换第一条消息。 单击发送按钮时会运行以下代码。

self.message = QtGui.QLabel()
# self.messageField is the QTextEdit where the user writes the message
text = self.messageField.toPlainText()
self.message.setText(text)
self.messageField.clear()
# self.messageLayout is our QVBoxLayout
self.messageLayout.addWidget(self.message)
self.messageLayout.setAlignment(self.message, QtCore.Qt.AlignTop)
# self.widget is on top od the QScrollArea and it holds the QVBoxLayout
self.widget.setLayoutDirection(QtCore.Qt.RightToLeft)
self.widget.setLayout(self.messageLayout)

我不知道问题出在哪里

1 个答案:

答案 0 :(得分:1)

self.message = QtGui.QLabel()替换存储为实例属性的第一个QLabel引用。

尝试实现列表,以便从头开始存储所有消息。

您需要先使用__init__方法添加此内容:

self.messages = []

在按钮触发的方法中:

message = QtGui.QLabel()

text = self.messageField.toPlainText()
message.setText(text)
self.messageField.clear()
self.messageLayout.addWidget(message)
self.widget.setLayoutDirection(QtCore.Qt.RightToLeft)
self.widget.setLayout(self.messageLayout)
# and to keep a direct reference :
self.messages.append(message)

编辑:

您可能需要在开始时定义对齐,只需在定义布局后定义,这可能会修复居中的消息问题:

self.messageLayout = QVBoxLayout() # (i assume...)
self.messageLayout.setAlignment(QtCore.Qt.AlignTop)

并且我认为你应该对这两行做同样的事情,每次你向列表追加消息时都不需要重复这一行:

self.widget.setLayoutDirection(QtCore.Qt.RightToLeft)
self.widget.setLayout(self.messageLayout)`