Qt布局,在窗口小部件大小更改后调整为最小值

时间:2013-02-20 13:07:36

标签: qt layout qt5 qgridlayout

基本上我有一个QGridLayout,里面有几个小部件。重要的是2个标签,我用它们将图像绘制到屏幕上。好吧,如果用户想要,他可以改变传入图像的分辨率,从而迫使标签调整大小。

假设标签的初始大小为320x240。用户将VideoMode更改为640x480,标签和整个GUI完美调整大小。但是当用户切换回320x240时,标签会缩小,但布局/窗口不会缩小。

我玩过sizePoliciessizeHints以及resize(0,0),但没有做到这一点。有人可以帮我吗?

这里有一些截图来澄清问题:

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

4 个答案:

答案 0 :(得分:33)

您需要将包含所有小部件的布局的大小限制设置为“SetFixedSize”。虽然名称听起来不起作用,但它确保您的布局仅使用它所需的空间。您将不会像在第二个屏幕截图中那样遇到问题。

示例:

mainLayout.setSizeConstraint(QLayout::SetFixedSize);

答案 1 :(得分:5)

QLayout :: setSizeConstraint(QLayout :: SetFixedSize)可以很好地解决这个问题,因为您希望始终保持窗口小部件的大小固定 - 也就是说,如果您希望它始终固定为“打包”大小(这可能会随着子窗口小部件改变大小而变化)。这就是“固定”在那里意味着:“固定”到正确的尺寸,即使后者变化。 (在Qt术语中,我称之为“打包”大小的只是小部件的sizeHint。)

但在某些情况下,约束可能是一个太强大的解决方案。特别是,如果将其应用于顶级窗口,则用户将无法自由调整窗口大小。如果您不喜欢这样,您可以在每次需要时立即执行“set size to sizeHint”操作,而不是将其强加为不间断的约束。这样做的方法是调用QWidget :: adjustSize()。

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

请注意,如果子项更改大小的容器不是顶级窗口,则可能必须在容器及其父项上递归调用adjustSize()。 (在我的情况下,我必须这样做,无论如何。我也尝试了大小约束方案,并发现仅在最高级别应用约束成功压缩所有级别。我对Qt的知识不足以进行有用的评论关于这些观察,我只是分享它们。)

答案 2 :(得分:2)

在对布局应用任何更改之前,您需要存储窗口小部件父窗口的原始大小,并在用户切换回原始窗口时将其还原。

请注意,您需要使用小部件父窗口大小,而不是小部件父级大小。

在应用布局更改之前,在窗口小部件中

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

完成窗口小部件重组后的紧凑尺寸

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

答案 3 :(得分:1)

这正是我在mu项目中所做的。 决议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();

 }
}