Подтвердить что ты не робот

Qt Layout, изменение размера до минимума после изменения размера виджета

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

Предположим, что начальный размер метки равен 320x240. Пользователь изменяет VideoMode на 640x480, ярлык и весь графический интерфейс полностью изменяются. Но когда пользователь переключается на 320x240, метка сжимается, но макет/окно НЕ.

Я играл с sizePolicies и sizeHints и resize(0,0), но ничего не сделал. Может ли кто-нибудь помочь мне в этом?

Вот несколько скриншотов, чтобы прояснить проблему:

Here, everything is okaystill, 640 x 480 resizes perfectlybut here, the layout is too big.

4b9b3361

Ответ 1

Вам нужно установить ограничение размера макета, содержащего все ваши виджеты, в "SetFixedSize". Хотя имя не похоже на то, что оно будет работать, оно гарантирует, что ваш макет будет использовать только пространство, в котором он нуждается. У вас не будет такой проблемы, как на втором скриншоте.

Пример:

mainLayout.setSizeConstraint(QLayout::SetFixedSize);

Ответ 2

QLayout:: setSizeConstraint (QLayout:: SetFixedSize) хорошо решает эту проблему, если вы предпочитаете постоянно фиксировать размер виджета, то есть, если вы хотите, чтобы он всегда был привязан к его "упакованному" размеру ( которые могут по-прежнему меняться по мере изменения размеров дочерних виджетах). Именно это означает "фиксированный": "фиксированный" до нужного размера, даже если последний изменяется. (В терминах Qt то, что я называю "упакованным" размером, это просто размер виджета.)

Но ограничение может быть слишком сильным решением в некоторых случаях. В частности, если вы примените его к окну верхнего уровня, тогда пользователь не будет иметь возможность изменять размер окна. Если вам это не нравится, вы можете вместо этого выполнять операцию "установить размер по размеру" мгновенно каждый раз, когда это необходимо, вместо того, чтобы навязывать его как неумолимое ограничение. Способ сделать это - вызвать QWidget:: adjustSize().

http://doc.qt.io/qt-5/qwidget.html#adjustSize

Обратите внимание: если контейнер, чьи дочерние элементы изменяют размер, не является окном верхнего уровня, тогда adjustSize() может быть вызван рекурсивно на контейнере и его родителях. (В моем случае я должен был это сделать, так или иначе. Я также попробовал схему ограничения размера и обнаружил, что применение ограничения только на самом верхнем уровне было успешным в уплотнении всех уровней. У меня недостаточно знаний о Qt для комментариев по этим наблюдениям, поэтому я просто разделяю их.)

Ответ 3

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

Обратите внимание, что вам нужно работать с размером родительского окна виджетов, а не с размером .

в виджетах перед применением изменений макета:

minimumWindowSize = this->window().size();

когда вы закончили реорганизацию виджета до компактного размера

this->window().resize(minimumWindowSize);

Ответ 4

Итак, это именно то, что я делаю в mu-проекте. Разрешение не имеет значения. У меня есть только виджет для рендеринга видео или изображения в вашем случае.

void MainWindow::resizeEvent(QResizeEvent* event)
 {
   QMainWindow::resizeEvent(event);
   if ((player != 0) && ((player->isPlaying()) || player->isLoaded() || player>isLoaded())){
     renderer->resize(ui->mainVideoWidget->width(),ui->mainVideoWidget->height());
     resizeFilter();

 }
}