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

时间:2017-07-11 07:30:33

标签: qt pyqt pyside

我需要获得QTextDocument的实际高度,以便能够将包含QPlainTextEdit设置为最小高度(同时保持其宽度不变),以便它显示整个内容而不显示垂直滚动条。我试图按照这个问题(以接受的答案结束)How do I determine the height of a 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)和行间距,文档边距以及基于实现细节的其他一些复杂的东西......等等

那么有出路吗?

2 个答案:

答案 0 :(得分:1)

所以我终于找到了一个解决方案,但它真的很难看。如果有人知道更好的事情,请发表。

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 :(得分:0)

在没有测试的情况下在黑暗中拍摄

你看过@ pageSize吗?

来自文档:

  

此属性包含应用于布置文档的页面大小

     

单位由底层油漆设备决定。大小是   在绘制到屏幕时以及在点上以逻辑像素测量   (1/72英寸)涂在打印机上时。

     

默认情况下,对于新创建的空文档,此属性   包含未定义的大小。

如果您按照其他主题的指示设置pageSize,我希望您在QPlainTextEdit :: setMinimumHeight需要的像素中获取值。