Я пытаюсь использовать виджет QTextEdit внутри формы, содержащей несколько виджетов QT. Сама форма находится внутри QScrollArea, которая является центральным виджетами для окна. Мое намерение заключается в том, что любая необходимая прокрутка будет проходить в основной QScrollArea (а не внутри любых виджетов), и любые виджеты внутри автоматически изменят их высоту, чтобы сохранить их содержимое.
Я попытался реализовать автоматическое изменение высоты с помощью QTextEdit, но столкнулся с нечетной проблемой. Я создал подкласс QTextEdit и переопределил sizeHint() следующим образом:
QSize OperationEditor::sizeHint() const {
QSize sizehint = QTextBrowser::sizeHint();
sizehint.setHeight(this->fitted_height);
return sizehint;
}
this- > installed_height поддерживается последним через этот слот, который подключен к сигналу "contentsChanged()" QTextEdit:
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, а не просто делает его действительно большим, чтобы начать, тогда он заканчивается, когда он заполняет текущее окно и начинает прокрутку, а не растет.
Я проследил эту проблему в том, что независимо от того, что возвращает мой размерHint(), он никогда не будет изменять размер QTextEdit больше, чем значение, возвращаемое из maximumViewportSize(), которое унаследовано от QAbstractScrollArea. Обратите внимание, что это не тот же номер, что и viewport() → maximumSize(). Я не могу понять, как установить это значение.
При взгляде на исходный код QT, максимальныйViewportSize() возвращает "размер окна просмотра, как если бы полосы прокрутки не имели допустимого диапазона прокрутки". Это значение в основном вычисляется как текущий размер виджета минус (2 * frameWidth + margin) плюс любые ширины/высоты полосы прокрутки. Это не имеет для меня большого смысла, и мне непонятно, почему этот номер будет использоваться где угодно, чтобы переуступить реализацию sub-class sizeHint(). Кроме того, кажется странным, что одно целое число "frameWidth" используется для вычисления ширины и высоты.
Может кто-нибудь пролить свет на это? Я подозреваю, что мое плохое понимание механизма компоновки QT здесь виновато.
Изменить: после первоначальной публикации этого вопроса у меня возникла идея переопределить maximumViewportSize(), чтобы вернуть то же самое, что и sizeHint(). К сожалению, это не сработало, поскольку у меня все еще есть одна и та же проблема.