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

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

предположим, что начальный размер метка 320x240. Пользователь изменяет Видеомод на 640x480, этикетка и весь GUI прекрасно изменяет. Но когда пользователь переключается обратно на 320x240, метка сжимается, но Макет / окно - нет.

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

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

Here, everything is okaystill, 640 x 480 resizes perfectlybut here, the <a href=layout is too big." src="/images/content/14980620/a9040e3f8939cb13a4282eb99cc144c8.png">

4 ответов


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

пример:

mainLayout.setSizeConstraint(QLayout::SetFixedSize);

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

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

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

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


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

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

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

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

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

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

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

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();

 }
}