В Qt, как мне сделать диалог не изменяемым по размеру, но автоматически подстраивая его размер к содержимому?

У меня есть экземпляр QDialog, заполненный виджетами с использованием кода, сгенерированного uic. Диалоговое окно содержит несколько меток, расположенных вертикально, и я время от времени открываю диалоговое окно, чтобы показать текст в этих метках. Текст может быть многострочным и его длина заранее не определена. Я установил фиксированную политику вертикального размера, поэтому пользователь не может ее перетаскивать (не имеет смысла), но я также хочу, чтобы диалоговое окно изменяло свой размер перед отображением, чтобы соответствовать текущему размеру меток.

С этой целью я вызывал QWidget::adjustSize() в QDialog перед его отображением, но это не работает должным образом. Когда отображается диалоговое окно, кажется, что он сохраняет (неправильный) размер из предыдущего отображения, но когда я щелкаю мышью в (отключенном) режиме вертикального изменения размера, диалоговое окно внезапно «привязывается» к (правильному) настроенному размеру.

Есть ли способ заставить мой диалог отображаться правильно?

EDIT: я связал совет rubenvb и получил следующее:

QSizePolicy free(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
QSizePolicy fixed(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
dialog->setSizePolicy(free);
dialog->adjustSize();
dialog->setSizePolicy(fixed);
dialog->show();

К сожалению, похоже, это ничего не изменило.


person neuviemeporte    schedule 25.04.2011    source источник
comment
Попробуйте обновить диалоговое окно после настройки его размера, чтобы заставить виджет перерисовать себя.   -  person Patrice Bernassola    schedule 26.04.2011
comment
Вы имеете в виду QObject::update()?   -  person neuviemeporte    schedule 27.04.2011
comment
Я имею в виду updateGeometry: doc.qt.nokia.com/latest/qwidget.html# обновитьгеометрию   -  person Patrice Bernassola    schedule 27.04.2011


Ответы (2)


Это не тот ответ, на который вы надеетесь, и он может не относиться к тому, что вы пытаетесь сделать, однако единственным способом, которым я смог настроить размеры QWidget во время выполнения, была обработка метод resizeEvent(..) объекта. Это позволило мне рассчитать размер элементов на основе используемого шрифта, количества строк, доступного пространства и т. д., а затем соответствующим образом настроить их размер перед передачей «события» базовому методу resizeEvent(..).

В моем подходе использовался один контейнер QWidget внутри окна, под заголовком, над областью состояния нижнего колонтитула и справа от столбца кнопок меню. Контейнер виджета внутри вызова resizeEvent() будет смотреть на объекты, которые он собирался отображать, вычислять высоту используемого шрифта, а затем изменять размер некоторых элементов в соответствии с их размерами (из-за того, как таблица стилей выбирает шрифты и цвета, и т. д.), а затем отрегулируйте размеры подвиджета, прежде чем разрешить виджету-контейнеру получать сообщение resizeEvent().

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

Надеюсь, вы найдете это полезным.

person Charlie    schedule 25.04.2011
comment
Что ж, если это окажется необходимым, то, наверное, мне придется пройти и через это, но я бы не хотел. :) AdjustSize() отлично работает для меня, просто кажется, что мне нужно каким-то образом принудительно обновить какое-то обновление, прежде чем показывать диалог. - person neuviemeporte; 25.04.2011

Делайте все в правильном порядке:

  1. Диалог не отображается. Диалог можно изменять.

  2. Рассчитать новый размер, установить новый размер.

  3. Установите для диалога неизменяемый размер.

  4. Показать диалог.

  5. Скрыть диалоговое окно, перейти к первому шагу.

person rubenvb    schedule 25.04.2011
comment
Пробовал, не работает; см. редактирование. Хотя это казалось отличной идеей. :( - person neuviemeporte; 25.04.2011
comment
Какая часть не работает? Вы уверены, что получаете правильный размер с помощью таких вещей, как sizeHint и друзей? - person rubenvb; 25.04.2011
comment
Часть, где все происходит так же, как и раньше? Я не стал заморачиваться с sizeHint, я решил, что значение от Designer подойдет. - person neuviemeporte; 27.04.2011
comment
@neuviemeporte: очень важно, чтобы вы знали, какой размер он получает, потому что adjustSize использует sizeHint и друзей: doc.qt.nokia.com/latest/qwidget.html#adjustSize Попробуйте изменить размер вручную, чтобы убедиться, что мой способ действительно работает, и ваша проблема, безусловно, основана на том, что что-то идет не так (не по вашей вине как таковой) в sizeHint. - person rubenvb; 27.04.2011