保持 QPlainTextEdit 尽可能小而不需要滚动条
Posted
技术标签:
【中文标题】保持 QPlainTextEdit 尽可能小而不需要滚动条【英文标题】:Keeping QPlainTextEdit as small as possible without needing a scroll bar 【发布时间】:2020-08-31 22:43:02 【问题描述】:我有一个QPlainTextEdit
,它将包含不同数量的文本 - 有时什么都没有,有时太多以至于它会环绕几十次。我想保持QPlainTextEdit
尽可能高,以保持其所有内容可见。除非完全为空,否则不应有空行。
我尝试将尺寸策略设置为Minimum
和MinimumExpanding
,并将最小和最大高度设置为零。没有这些作品的组合;在所有情况下,一个空的QPlainTextEdit
大约有四行半高。
似乎将高度降低到这个 4.5 行限制以下的唯一东西是setFixedHeight
。但是,如果我这样做,那么我将需要自己计算所需的高度,这会破坏首先使用库的意义。
现在,我能想到的唯一可行的方法是这样的:
def onResize_or_textChanged(...):
my_text_edit.setHeight(0)
while my_text_exit has a visible scroll bar:
my_text_edit.setHeight(my_text_edit.height() + 1)
这显然是一个相当老套的解决方案。
如何使QPlainTextEdit
保持完全显示其文本所需的最小高度?
【问题讨论】:
【参考方案1】:解决方案是计算最小高度,以便使用blockBoundingGeometry()
可以看到所有QTextBlock
:
from PyQt5 import QtCore, QtWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.te = QtWidgets.QPlainTextEdit()
self.te.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.te.updateRequest.connect(self.handle_updateRequest)
self.handle_updateRequest()
central_widget = QtWidgets.QWidget()
lay = QtWidgets.QVBoxLayout(central_widget)
lay.addWidget(self.te, alignment=QtCore.Qt.AlignTop)
self.setCentralWidget(central_widget)
self.resize(640, 480)
def handle_updateRequest(self):
doc = self.te.document()
tb = doc.findBlockByNumber(doc.blockCount() - 1)
h = self.te.blockBoundingGeometry(tb).bottom() + 2 * doc.documentMargin()
self.te.setFixedHeight(h)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
【讨论】:
以上是关于保持 QPlainTextEdit 尽可能小而不需要滚动条的主要内容,如果未能解决你的问题,请参考以下文章
QPlainTextEdit 内的 QGraphicsView(可滚动小部件)