2013-02-20 5 views
11

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

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

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

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

Here, everything is okay still, 640 x 480 resizes perfectly but here, the layout is too big.

ответ

21

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

Пример:

mainLayout.setSizeConstraint(QLayout::SetFixedSize); 
+2

Спасибо! Это спасло меня еще пару часов поиска и отладки, вызванных этим ужасным наименованием. Почему SetFixedSize подразумевает «автоматическое изменение размера до минимального размера», которое семантически НЕ является фиксированным размером, поскольку минимальный размер зависит от (потенциально динамических) размеров содержимого виджета? Есть ли для этого объяснение? – hna

+0

Имя не имеет большого смысла, и это было некоторое время с тех пор, как я работал с Qt, поэтому не помню, как я это узнал. Но эта проблема надолго задержала меня. Рад, что это помогло вам – user929404

+0

Это, похоже, работает на все, кроме виджетов QScrollArea. Вы знаете решение для этого? – Assimilater

1

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

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

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

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

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

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

спасибо, я попробую это через несколько минут. Дело в том, что существует множество различных комбинаций разрешений от 320x240 до 1280x1024. Это займет до 10 конфигураций размеров. Нет ли способа Qt делать это автоматически? – Hafnernuss

+0

Я не тестировал его, но вы можете попробовать, только сохраняя минимальный размер (или даже предоставляя нулевой размер). Если я правильно, QT должен автоматически увеличить размер окна до минимального значения, чтобы отобразить все содержащиеся в нем виджеты. – Pierluigi

1

Так что это именно то, что я делаю в мю проекте. Разрешение 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(); 

} 
} 
5

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

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

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

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

Смежные вопросы