>我需要获取QTextDocument
的实际高度,以便能够将包含QPlainTextEdit
设置为最小高度(同时保持其宽度不变(,以便它显示整个内容而无需垂直滚动条。我试图遵循这个问题(以接受的答案结束(如何确定 QTextDocument 的高度?但它没有做到它所承诺的。
一段代码:
from PyQt5.QtWidgets import QApplication, QPlainTextEdit
app = QApplication([])
w = QPlainTextEdit()
w.setPlainText("Hello!")
print(w.document().size())
w.setPlainText("Hello!nHello again!")
print(w.document().size())
打印输出:
PyQt5.QtCore.QSizeF(35.0, 1.0)
PyQt5.QtCore.QSizeF(64.0, 2.0)
似乎宽度是以像素为单位正确测量的,但高度仅显示行数而不是像素。我认为将其与字体像素度量高度相乘无济于事,因为可以混合格式(通常它可以是富文本/HTML(和行距,文档边距以及基于实现细节的其他一些复杂内容...等。
那么有没有出路呢?
所以我终于找到了一个解决方案,但它真的很丑陋。如果有人知道更好的东西,请发布它。
from PyQt5.QtWidgets import QApplication, QPlainTextEdit
app = QApplication([])
w = QPlainTextEdit()
# test various formatting
w.appendHtml("<h1>Hello!</h1>")
w.appendHtml("<b>Hello!</b>")
w.appendPlainText("Hello!")
doc = w.document()
layout = doc.documentLayout()
h = 0
b = doc.begin()
while b != doc.end():
h += layout.blockBoundingRect(b).height()
b = b.next()
# magic formula: I do not know why the document margin is already
# once included in the height of the last block, and I do not know
# why there must be the number 1 at the end... but it works
w.setFixedHeight(h + doc.documentMargin() + 2 * w.frameWidth() + 1)
w.show()
app.exec_()
所以这应该显示没有滚动条的框。如果将高度降低 1,则会显示滚动条。这应该适用于任意数量的行、文档边距、框架宽度、格式等。
在黑暗中拍摄而不进行测试
你看过@页面大小吗?
从文档中:
此属性保存应用于布局文档的页面大小
单位由底层油漆装置决定。大小是 在屏幕上绘画时以逻辑像素为单位,以点为单位 (1/72英寸(在打印机上绘画时。
默认情况下,对于新创建的空文档,此属性 包含未定义的大小。
如果你按照另一个线程的指示设置页面大小,我希望你能以QPlainTextEdit::setMinimumHeight所需的像素获得值。