我需要获得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)和行间距,文档边距以及基于实现细节的其他一些复杂的东西......等等
那么有出路吗?
答案 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需要的像素中获取值。