2013-02-20 137 views
11

基本上我有一个QGridLayout,其中包含一些小部件。重要的是2个标签,我用它来将图像绘制到屏幕上。那么,如果用户想要,他可以改变传入图像的分辨率,从而迫使标签重新调整大小。Qt布局,在部件大小更改后调整到最小值

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

我玩过sizePoliciessizeHintsresize(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 2014-08-15 18:45:27

+0

这个名字没有什么意义,而且自从我和Qt一起工作了一段时间,所以我不记得我是如何发现这一点的。但是这个问题困扰了我一段时间。很高兴它帮助你 – user929404 2014-08-17 16:38:17

+0

这似乎适用于除QScrollArea小部件以外的所有内容。你知道这个解决方案吗? – Assimilater 2015-05-15 16:29:51

1

您需要存储您的小部件的父窗口的原始尺寸应用任何更改布局前,当用户将其还原切换回原来的。

请注意,您需要与控件父窗口大小,而不是控件父大小的工作。

在你的widget

应用布局更改之前:

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

当你完成重组的小部件紧凑的尺寸

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

谢谢你,我会在几分钟内尝试。事实是,有许多不同的分辨率组合,从320x240到1280x1024。这将最多需要10个尺寸配置。有没有办法Qt自动执行此操作? – Hafnernuss 2013-02-21 07:45:50

+0

我没有对它进行测试,但是您可以尝试只存储最小大小(或者甚至提供空值大小)。如果我是正确的QT应该自动增加窗口大小到最小值来显示所有包含的小部件 – Pierluigi 2013-02-21 13:22:45

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的大小提示。)

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

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

需要注意的是,如果他们的孩子正在改变大小不是顶级窗口,然后adjustSize()容器必须在容器和其父母递归调用。 (在我的情况下,我必须这样做,无论如何,我也尝试过大小​​限制方案,并且发现仅在最高级别上应用约束可以成功压缩所有级别,但我对Qt没有足够的了解来进行有效评论在这些意见,所以我只是分享他们)。