获取 QTextDocument 的确切高度(以像素为单位)



>我需要获取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所需的像素获得值。

相关内容

最新更新