В Qt, как сделать диалоговое окно неизменяемым, но при этом автоматически подстраивая его размер под содержимое? - PullRequest
0 голосов
/ 25 апреля 2011

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

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

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

РЕДАКТИРОВАТЬ: Я связал совет rubenvb и в итоге получил следующее:

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

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

Ответы [ 2 ]

0 голосов
/ 25 апреля 2011

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

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

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

  3. Установить для диалогового окна значение без изменения размера.

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

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

0 голосов
/ 25 апреля 2011

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

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

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

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

...