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

Haf*_*uss 22 layout qt qgridlayout qt5

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

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

我打得四处sizePoliciessizeHintsresize(0,0),但没有做的伎俩.有人可以帮我这个吗?

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

在这里,一切都很好 仍然,640 x 480完美调整大小 但在这里,布局太大了.

use*_*404 40

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

例:

mainLayout.setSizeConstraint(QLayout::SetFixedSize);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这让我节省了几个小时的搜索和调试,这是由这个可怕的命名造成的.为什么SetFixedSize意味着"自动调整大小到最小",这在语义上不是固定大小,因为最小大小取决于小部件内容的(可能是动态的)大小?这有什么解释吗? (2认同)

mjw*_*ach 8

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

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

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

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