我正在尝试制作聊天应用程序,因此有一个文本框,用户在内容中键入内容。 TextEdit框会每次动态调整大小,当我按下返回时,但是当它到达字段的末尾时,不幸的是,它会自动增加一点。
def func(self):
self.msgtext = QtGui.QTextEdit(self)
self.msgtext.setObjectName('msgtext')
self.msgtext.setStyleSheet("#msgtext {background-color: black; color: yellow; font-size: 18pt; }"
"#msgtext:highlight {color: red; }")
self.msgtext.setMaximumSize(500, 32)
self.msgtext.textChanged.connect(self.test)
def test(self):
lines = self.msgtext.document().blockCount()
self.msgtextplain = self.msgtext.toPlainText()
self.msgtext.setMaximumSize(500, 30*lines)
如图所示,它每次都会增加一行,但是当它到达字段的末尾时,它实际上并没有形成一个新行,只是尝试增加它的大小。
我已经尝试计算字符串的长度并使用简单的布尔值来插入新行,但它不起作用,因为:
我不得不把小写字母
f
110
次,以达到结束 线。但是,我必须将大写字母F
仅放置44
次才能达到 该行的结尾。
每次用户到达字段末尾时,如何让字段自动插入新行?我能算出QTextEdit字符串的长度吗?即使它是大写还是小写?
答案 0 :(得分:0)
这是一个有趣的问题,因为它实际上涉及在给定换行时测量文本宽度和高度,但也给出了可能的自动换行。全部受限制(即宽度)
我的建议是不计算新行数等,而不是让Qt
衡量text bounding rectangle (link to Qt5)。因此,给定500
的最大宽度以及限制矩形的足够大的高度,您可以执行以下操作:
font = self.msgtext.currentFont()
metric = QFontMetric(font)
rect = metric.boundingRect(0, 0, 500, 10000,
Qt.AlignTop | Qt.AlignLeft | Qt.TextWordWrap,
self.msgtext.toPlainText())
结果高度可在rect
rect.height()
请注意,这只是一个指南,它不提供工作代码。它也不会马上解决出现的问题。