QTextEdit 展开直到完全可见

QTextEdit expand until fully visible

我有一个 QDialog(QVBoxLayout),按顺序包含以下小部件:QTextEditQLabel[layout stretch]QPushButton

问题是我希望 QTextEditQDialog 一起展开,但只能等到滚动条消失,之后布局拉伸应该开始展开,显示 QDialog 之间的间隙=14=] 和 QPushButton.

解决这个问题的明智方法是什么?
注意:QDialog 可以调整大小,QTextEdit 可以自动换行。

编辑:对于 Qt4/PySide,以下应该有效

class TextEdit(qt.QTextEdit):
    def __init__(self, *args, **kwargs):
        qt.QTextEdit.__init__(self, *args, **kwargs)
        self.document().modificationChanged.connect(self.updateMaxHeight)

    def updateMaxHeight(self, *args):
        self.setMaximumHeight(self.document().size().height())

    def resizeEvent(self, e):
        qt.QTextEdit.resizeEvent(self, e)
        self.updateMaxHeight()

class MyDialog(qt.QDialog):
    def __init__(self, *args, **kwargs):
        qt.QDialog.__init__(self, *args, **kwargs)
        self.setLayout(qt.QVBoxLayout())
        self.textEdit = TextEdit('Example text')
        self.layout().addWidget(self.textEdit, 1) #1 for resizable
        self.layout().addWidget(qt.QLabel('Example label')
        self.layout().addStretch()
        self.layout().addWidget(qt.QPushButton('Example button')

这比看起来更难:

class TextEdit : public QTextEdit
{
public:
  TextEdit(QWidget *parent = nullptr)
    : QTextEdit(parent)
  {
    setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
    connect(this, &TextEdit::textChanged, this, &TextEdit::updateGeometry);
  }

  QSize viewportSizeHint() const override
  {
    return document()->size().toSize();
  }
};

想法是使视口大小提示与文档大小相对应,并使滚动区域适应视口大小。您还必须确保在向文档添加新行时布局得到通知。

最后一个难题是为您的拉伸项目提供更大的拉伸系数,这样它就不会开始与编辑器共享 space:

layout->addStretch(1);