Я пытаюсь использовать виджет QTextEdit внутри формы, содержащей несколько виджетов QT. Сама форма находится внутри QScrollArea, который является центральным виджетом для окна. Мое намерение состоит в том, что любая необходимая прокрутка будет происходить в главной QScrollArea (а не внутри каких-либо виджетов), и любые виджеты внутри автоматически изменят свою высоту, чтобы сохранить их содержимое.
Я попытался реализовать автоматическое изменение высоты с помощью QTextEdit, но натолкнулся на странную проблему. Я создал подкласс QTextEdit и переопределил sizeHint () следующим образом:
QSize OperationEditor::sizeHint() const {
QSize sizehint = QTextBrowser::sizeHint();
sizehint.setHeight(this->fitted_height);
return sizehint;
}
this-> fit_height поддерживается в актуальном состоянии через этот слот, который подключен к сигналу QTextEdit "contentsChanged ()":
void OperationEditor::fitHeightToDocument() {
this->document()->setTextWidth(this->viewport()->width());
QSize document_size(this->document()->size().toSize());
this->fitted_height = document_size.height();
this->updateGeometry();
}
Политика размера подкласса QTextEdit:
this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
Я выбрал этот подход после прочтения этого поста.
Вот моя проблема:
Когда QTextEdit постепенно изменяет размеры, заполняя окно, оно перестает увеличиваться и начинает прокручиваться в QTextEdit, независимо от того, какая высота возвращается из sizeHint (). Если у меня изначально sizeHint () возвращает какое-то большое постоянное число, то QTextEdit очень большой и хорошо содержится во внешней QScrollArea, как и следовало ожидать. Однако, если sizeHint постепенно изменяет размер QTextEdit, а не просто делает его действительно большим для запуска, тогда он завершается, когда заполняет текущее окно и начинает прокручивать вместо увеличения.
Я проследил, что эта проблема заключается в том, что независимо от того, что возвращает мой sizeHint (), он никогда не изменит размер QTextEdit больше, чем значение, возвращаемое из MaximumViewportSize (), которое наследуется от QAbstractScrollArea. Обратите внимание, что это не тот же номер, что и viewport () -> MaximumSize (). Я не могу понять, как установить это значение.
Глядя на исходный код QT, MaximumViewportSize () возвращает «размер области просмотра, как если бы полосы прокрутки не имели допустимого диапазона прокрутки». Это значение в основном вычисляется как текущий размер виджета минус (2 * frameWidth + margins) плюс любая ширина / высота полосы прокрутки. Это не имеет большого смысла для меня, и мне не ясно, почему это число будет использоваться где-либо таким образом, который заменяет реализацию sizeHint () подкласса. Кроме того, кажется странным, что одно целое число «frameWidth» используется для вычисления как ширины, так и высоты.
Может кто-нибудь пролить свет на это? Я подозреваю, что мое плохое понимание механизма компоновки QT виновато здесь.
Редактировать: после первоначальной публикации у меня возникла идея переопределить maximumViewportSize (), чтобы он возвращал то же самое, что и sizeHint (). К сожалению, это не сработало, так как у меня все та же проблема.