保持 QPlainTextEdit 尽可能小而不需要滚动条

Posted

技术标签:

【中文标题】保持 QPlainTextEdit 尽可能小而不需要滚动条【英文标题】:Keeping QPlainTextEdit as small as possible without needing a scroll bar 【发布时间】:2020-08-31 22:43:02 【问题描述】:

我有一个QPlainTextEdit,它将包含不同数量的文本 - 有时什么都没有,有时太多以至于它会环绕几十次。我想保持QPlainTextEdit 尽可能高,以保持其所有内容可见。除非完全为空,否则不应有空行。

我尝试将尺寸策略设置为MinimumMinimumExpanding,并将最小和最大高度设置为零。没有这些作品的组合;在所有情况下,一个空的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(可滚动小部件)

墨菲定律 by 张鹏程

如何为 QPlainTextEdit 设置文本?

如何使CSS工具提示在原始项目上严格保持,而不是在新生成的工具提示上?

大话设计模式-职责链模式

如何在 Qt 中滚动产生错觉效果?