Как обновить QLayout и получить новые измерения перед возвратом? - PullRequest
2 голосов
/ 25 октября 2011

Это сводит меня с ума. У меня есть пользовательский класс меню, который, когда установлен видимым, показывает список элементов, расположенных в определенной папке. При нажатии аппаратной кнопки мое приложение получает последний список элементов, заполняет их меню и возвращает.

В меню, отображающем эти элементы, используется QListWidget, заполненный пользовательскими виджетами. Каждый из виджетов содержит один или несколько QLabels в горизонтальной компоновке и создается во время отображения меню. Чтобы настроить отображаемый текст на основе доступной ширины меню, мне нужно получить размер QLabel ПОСЛЕ того, как он был изменен в соответствии с макетом, но до того, как меню станет видимым для пользователя. Проблема в том, что мой макет не обновляется, пока не вернутся все функции, составляющие мой список.

Я пробовал QApplication :: ProcessEvents () и функции обновления макета, но ни один из них не обновил значения моего QLabels перед возвратом. Я могу установить QTimer, когда кнопка первоначально нажата, и она показывает меню, обновляет элементы и останавливает себя, но это кажется ужасным решением.

Любая помощь будет принята с благодарностью! Я потратил большую часть дня на это.

Марлон

Ответы [ 4 ]

3 голосов
/ 24 мая 2016

Как обновить QLayout и получить новые размеры перед возвратом?

Не. Вы не должны это делать. Это сведет вас с ума, потому что вы делаете это задом наперед. Обновления макета обрабатываются асинхронно из цикла событий. Вместо того, чтобы сразу получать размеры макета, настройте себя как часть системы. Некоторые варианты:

  1. Реализация пользовательского виджета, который будет правильно взаимодействовать с макетом, увеличиваясь в зависимости от доступной ширины макета. Возможно, все, что вам нужно, это политика размера и способ elide text ?

  2. Создайте пользовательский макет, учитывающий особые свойства вашего варианта использования.

2 голосов
/ 24 мая 2016

У меня была именно эта проблема, и я не мог найти ответ нигде в Интернете. Вызов Layout.update(), Layout.activate() или widget.adjustSize() (все предложено в разных местах) не сработал.

У меня был виджет с вертикальной компоновкой, к которому я хотел добавить QLabel, а затем сразу использовать размер QLabel.

Надежно работало только

layout->addWidget(myLabel);
myLabel->show();
size = myLabel->size();

Может показаться, что раскладки просто не будут пересчитаны, пока вы не вернетесь из функции и не дадите циклу событий Qt продолжиться, или сами не вызовете show() вручную.

2 голосов
/ 25 октября 2011

Вы пробовали использовать layout()->update();?

1 голос
/ 25 октября 2011

Вы хотите позвонить QWidget::adjustSize() на ваш родительский виджет.Это заставит макеты пересчитать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...