2

我有一个QDialog( QVBoxLayout) ,其中包含以下小部件:QTextEdit, QLabel, [layout stretch],QPushButton

问题是我想用QTextEdit展开,但只能在滚动条消失之前,布局拉伸应该开始展开,显示和QDialog之间的间隙。QLabelQPushButton

什么是明智的做法?
注意: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')
4

1 回答 1

1

这比看起来更困难:

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();
  }
};

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

难题的最后一块是给你的拉伸项目一个更大的拉伸因子,这样它就不会开始与编辑器共享空间:

layout->addStretch(1);
于 2017-03-21T02:51:18.913 回答