Изменение размеров QTextEdit QT для Соответствия текстовой Высоте: maximumViewportSize ()

Я пытаюсь использовать виджет QTextEdit в форме, содержащей несколько спокойных виджетов. Сама форма находится в QScrollArea, который является центральным виджетом для окна. Мое намерение состоит в том, что любая необходимая прокрутка произойдет в основном QScrollArea (а не в любых виджетах), и любые виджеты внутри автоматически изменят размер своей высоты для содержания их содержания.

Я попытался реализовать автоматическое изменение размеров высоты с QTextEdit, но столкнулся с нечетной проблемой. Я создал подкласс QTextEdit и повторно реализовал sizeHint () как это:

QSize OperationEditor::sizeHint() const {
  QSize sizehint = QTextBrowser::sizeHint();
  sizehint.setHeight(this->fitted_height);
  return sizehint;
}

это-> fitted_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. Обратите внимание, что это не то же число как область просмотра ()-> maximumSize (). Я не могу выяснить, как установить то значение.

Смотрение на исходный код QT, maximumViewportSize () возвращает "размер области просмотра, как будто полосы прокрутки не имели никакого допустимого диапазона прокрутки". Это значение в основном вычисляется как текущий размер виджета минус (2 * frameWidth + поля) плюс любые ширины/высоты полосы прокрутки. Это не имеет большой смысл мне, и мне не ясно, почему то число использовалось бы где угодно способом что supercede's sizeHint подкласса () реализация. Кроме того, это действительно кажется нечетным, что единственное "frameWidth" целое число используется в вычислениях и ширина и высота.

Кто-либо может пролить некоторый свет на это? Я подозреваю, что мое плохое понимание механизма расположения QT виновато здесь.

Править: после начальной регистрации этого у меня была идея повторно реализовать maximumViewportSize () для возврата того же самого как sizeHint (). К сожалению, это не работало, поскольку у меня все еще есть та же проблема.

11
задан Community 23 May 2017 в 12:10
поделиться

2 ответа

Я решил эту проблему. Было две вещи, которые я должен был сделать, чтобы заставить его работать:

  1. Пройдитесь по иерархии виджетов и убедитесь, что все политики размеров имеют смысл, чтобы убедиться, что если любой дочерний виджет хочет быть большим/маленьким, то родительский виджет хочет быть таким же.

  2. Это основной источник исправления. Оказывается, поскольку QTextEdit находится внутри QFrame, который является главным виджетом в QScrollArea, QScrollArea имеет ограничение, что он не будет изменять размер внутреннего виджета, если свойство "widgetResizable" не равно true. Документация по этому вопросу находится здесь: http://doc.qt.io/qt-4.8/qscrollarea.html#widgetResizable-prop. Документация не была мне понятна, пока я не поиграл с этой настройкой и не заставил ее работать. Из документации следует, что это свойство относится только к случаям, когда главная область прокрутки хочет изменить размер виджета (т.е. от родительского к дочернему). На самом деле это означает, что если главный виджет в области прокрутки хочет когда-либо изменить размер (т.е. от дочернего к родительскому), то этот параметр должен быть установлен в true.

Итак, мораль истории такова: код QTextEdit правильно переопределил sizeHint, но QScrollArea игнорировала значение, возвращаемое из sizeHint основного фрейма.

Ура! Работает!

10
ответ дан 3 December 2019 в 10:03
поделиться

Вы можете попробовать установить свойство minimumSize для QTextEdit , чтобы увидеть, не приведет ли это к увеличению размера макета.

Я не понимаю большую часть схемы компоновки Qt, но установка минимального и максимального размера в значительной степени делает то, что я хочу. Ну, по крайней мере, в большинстве случаев.

0
ответ дан 3 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: