我在这里领悟PyQt5,我写一个聊天。我需要设置消息小部件的样式。
问题是什么:用户缩小聊天窗口,消息小部件随之缩小,分别位于不可编辑的文本QPlainTextEdit,消息自动换行到下一行,即高度增长,消息小部件本身不会扩展,并且QPlainTextEdit出现滚动,但它应该使滚动不会出现,而是QPlainTextEdit根据其中文本的高度(或行数)增加(和减少)其高度。
在图片上:
窗口的初始位置(我们可以看到,消息的高度不适应):

缩小窗口(我们可以看到,消息的最后一行是隐藏的):

我尝试了什么:
- 我连接了
documentSizeChanged来自 documentLayout 的信号,并根据文档的高度增加或减少了消息的高度。但是,在编辑时会出现此信号QPlainTextEdit,对我来说它只显示文本。连接到documentSizeChanged:txtMessageText.document().documentLayout().documentSizeChanged.connect(self.on_documentSize_changed)
我看不出插入插槽代码的意义,因为这个信号无论如何都不起作用。
- 我挂上了信号 rangeChanged y
verticalScrollBar并根据滚动条的最大值增加或减少消息的高度,但是,使用这种方法,如果窗口扩展到全屏,则消息不会改变其大小。
连接到rangeChanged:
txtMessageText.verticalScrollBar().rangeChanged.connect(self.on_range_changed)
插槽on_range_changed:
@pyqtSlot(int, int)
def on_mod_changed(self, min_, max_):
# нашел виджет сообщения
parent = self.sender().parent().parent().parent().parent().parent().parent()
# изменяю размер пока так:
# (к сообщению добавляется пустая строка, которая будет скрыта,
# то есть постоянно пытаюсь сохранить максимальное значение равным 1 (max_==1))
if max_>1:
parent.setMinimumSize(parent.minimumWidth(), parent.minimumHeight() + 25)
parent.setMaximumSize(parent.maximumWidth(), parent.minimumHeight() + 25)
elif max_<1:
parent.setMinimumSize(parent.minimumWidth(), parent.minimumHeight() - 25)
parent.setMaximumSize(parent.maximumWidth(), parent.minimumHeight() - 25)
你将如何在PyQt5QPlainTextEdit中进行高度适应?
升级版。这是一个最小的例子:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Client(object):
def setupUi(self, Client):
Client.setObjectName("Client")
Client.resize(522, 228)
Client.setStyleSheet("QMainWindow{\n"
"background-color: #29334A;\n"
"}\n"
"\n"
"QFrame {\n"
"background-color: #29334A;\n"
"}\n"
"\n"
"QLabel {\n"
"color: #E8EAF1;\n"
"font-size:24px\n"
"}\n"
"\n"
"QPlainTextEdit {\n"
"color: #E8EAF1;\n"
"}\n"
"\n"
"")
self.centralwidget = QtWidgets.QWidget(Client)
self.centralwidget.setMinimumSize(QtCore.QSize(0, 6))
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.scrollArea = QtWidgets.QScrollArea(self.centralwidget)
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 502, 408))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.frame_2 = QtWidgets.QFrame(self.scrollAreaWidgetContents)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth())
self.frame_2.setSizePolicy(sizePolicy)
self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_2.setObjectName("frame_2")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame_2)
self.horizontalLayout.setObjectName("horizontalLayout")
self.frame = QtWidgets.QFrame(self.frame_2)
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.verticalLayout = QtWidgets.QVBoxLayout(self.frame)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtWidgets.QLabel(self.frame)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.plainTextEdit = QtWidgets.QPlainTextEdit(self.frame)
self.plainTextEdit.setReadOnly(True)
self.plainTextEdit.setObjectName("plainTextEdit")
self.verticalLayout.addWidget(self.plainTextEdit)
self.label_2 = QtWidgets.QLabel(self.frame)
self.label_2.setObjectName("label_2")
self.verticalLayout.addWidget(self.label_2)
self.horizontalLayout.addWidget(self.frame)
spacerItem = QtWidgets.QSpacerItem(197, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.verticalLayout_3.addWidget(self.frame_2)
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_3.addItem(spacerItem1)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.verticalLayout_2.addWidget(self.scrollArea)
Client.setCentralWidget(self.centralwidget)
self.retranslateUi(Client)
QtCore.QMetaObject.connectSlotsByName(Client)
def retranslateUi(self, Client):
_translate = QtCore.QCoreApplication.translate
Client.setWindowTitle(_translate("Client", "Client"))
self.label.setText(_translate("Client", "Имя Пользователя"))
self.plainTextEdit.setPlainText(_translate("Client", "11111111111111111111111111111111111111111222222222222222222222222222222222222222223333333333333333333333333333333333333333344444444444444444444444444444444444444444555555555555555555555555555555555555555556666666666666666666666666666666666666666677777777777777777777777777777777777777777888888888888888888888888888888888888888889999999999999999999999999999999999999999910101010101010101010101010101010101010101"))
self.label_2.setText(_translate("Client", "Дата Время"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Client = QtWidgets.QMainWindow()
ui = Ui_Client()
ui.setupUi(Client)
Client.show()
sys.exit(app.exec_())
其中会发生什么:当应用程序窗口变窄时,会QPlainTextEdit出现滚动,并且隐藏了部分文本,但是您需要确保消息的高度随着QPlainTextEdit.
请注意,我已删除
self.plainTextEdit.setReadOnly(True),因此您可以检查发生了什么。