QTextEdit развернуть до полной видимости

У меня есть QDialog(QVBoxLayout) со следующими виджетами по порядку: QTextEdit, QLabel, [layout stretch], QPushButton

Проблема в том, что я хотел бы QTextEdit расширить с QDialog, но только до тех пор, пока полоса прокрутки не исчезнет, ​​после чего растяжение макета должно начать расширяться, обнаруживая зазор между QLabel и 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')

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);
Другие вопросы по тегам