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