Qt 调整窗口大小以适应内容

Qt 调整窗口大小以适应内容,qt,qlayout,Qt,Qlayout,我有一个QGLWidget,我想将其调整到给定的分辨率(大于包含的窗口)。 我的意图是,窗口会一直扩展,直到小部件安装到内部,但却找不到方法 在调整QGLWidget的大小后,我尝试了几个命令以使其正常工作,但没有成功。 我将在这里列出结果: 不做其他事情:小部件覆盖整个窗口。最终它将被调整大小以适应较小的窗口 mainWindow.adjustSize():小部件的大小调整为(0,0) mainWindow.resize(mainWindow.sizeHint()):参见上文 mainWin

我有一个QGLWidget,我想将其调整到给定的分辨率(大于包含的窗口)。 我的意图是,窗口会一直扩展,直到小部件安装到内部,但却找不到方法

在调整QGLWidget的大小后,我尝试了几个命令以使其正常工作,但没有成功。 我将在这里列出结果:

  • 不做其他事情:小部件覆盖整个窗口。最终它将被调整大小以适应较小的窗口
  • mainWindow.adjustSize()
    :小部件的大小调整为(0,0)
  • mainWindow.resize(mainWindow.sizeHint())
    :参见上文
  • mainWindow.resize(mainWindow.minimumSizeHint())
    :参见上文
我还了解到,在执行mainWindow resize I之前,需要运行事件循环以重新计算新的大小,因此我插入了
QCoreApplication::processEvents
,以执行此操作,但没有任何可见效果

那么如何通过小部件调整窗口大小呢

编辑

GLWidget不是窗口的唯一窗口小部件。 它与一个分组框一起嵌入到拆分器中。

因此,假设将
QGLWidget
嵌套在
QMainWindow
中作为中心小部件,则需要设置
QGLWidget
的大小策略

例如:

QGLWidget * glw; // in your header for QMainWindow


希望这能有所帮助。

我有一个应用程序需要与您的要求非常相似,所以我将在这里发布我的解决方案。覆盖窗口的图像,可自由展开和收缩,并可更改为原始大小,然后保持可展开/收缩

我使用了一个QLabel小部件来显示图像,但它也可以用于其他小部件类型。我创建了具有初始大小和
QSizePolicy::Ignored
的小部件

label->resize (w, h); // initial size
label->setSizePolicy (QSizePolicy::Ignored, QSizePolicy::Ignored);
标签小部件位于QVBoxLayout中,窗口中有几个按钮,但这也适用于其他布局类型

可以使用以下代码将窗口和图像小部件的大小调整为图像的原始大小:

label->resize (w, h); // change to original size
label->setMinimumSize (w, h); // prevent it from collapsing to zero immediately
window->adjustSize (); // resize the window
label->setMinimumSize (0, 0); // allow shrinking afterwards

虽然这确实会将窗口调整到所需的大小,但它会阻止用户进一步调整大小。从文档中:
将小部件的最小和最大大小都设置为s,从而防止其不断增大或缩小。
我只是尝试保存和恢复旧的最小和最大大小,但这不会导致任何更改。请尝试
setFixedSize()
而不是
setFixedSize()
,并使用
setSizePolicy()
。使用
setSizePolicy()
,您确实可以控制事物的扩展和反应方式
setFixedSize()
一次可以做很多事情,所以在这种情况下,它可能不是您想要的。
minimumSize
对我来说似乎也是错误的。用户应该能够任意调整大小。我只需要将窗口弹出到适合
QGLWidget
请求大小的大小。Hm似乎没有
setSizeHint()
函数。你是对的。下面是关于它的详细解释:不幸的是,这对我不起作用。小部件的大小已经调整了,但是窗口上的将窗口折叠到小部件的大小以下。可能是我使用的拆分器造成的。您好,抱歉,我错误地单击了“向下投票”按钮,但我完全不是故意的。我试图撤消,但它不允许我这样做。请向我道歉:(那么…你找到解决这个问题的方法了吗?我也遇到了同样的问题,我不得不妥协于
setMinimumSize()
)。
label->resize (w, h); // change to original size
label->setMinimumSize (w, h); // prevent it from collapsing to zero immediately
window->adjustSize (); // resize the window
label->setMinimumSize (0, 0); // allow shrinking afterwards