Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt布局,小部件大小更改后调整为最小_Qt_Layout_Qt5_Qgridlayout - Fatal编程技术网

Qt布局,小部件大小更改后调整为最小

Qt布局,小部件大小更改后调整为最小,qt,layout,qt5,qgridlayout,Qt,Layout,Qt5,Qgridlayout,基本上我有一个QGridLayout,里面有一些小部件。最重要的是2个标签,我用它们在屏幕上绘制图像。如果用户愿意,他可以更改传入图像的分辨率,从而强制调整标签的大小 让我们假设标签的初始大小是320x240。用户将VideoMode更改为640x480,标签和整个GUI的大小将完全调整。但当用户切换回320x240时,标签会缩小,但布局/窗口不会缩小 我玩过sizePolicies和sizeHints,以及resize(0,0),但没有任何效果。有人能帮我吗 下面是一些澄清问题的屏幕截图:

基本上我有一个
QGridLayout
,里面有一些小部件。最重要的是2个标签,我用它们在屏幕上绘制图像。如果用户愿意,他可以更改传入图像的分辨率,从而强制调整标签的大小

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

我玩过
sizePolicies
sizeHints
,以及
resize(0,0)
,但没有任何效果。有人能帮我吗

下面是一些澄清问题的屏幕截图:


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

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

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

minimumWindowSize = this->window().size();
当您将小部件重新组织到紧凑的大小时

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

您需要将包含所有小部件的布局的大小约束设置为“SetFixedSize”。虽然名称听起来不太合适,但它可以确保布局只使用所需的空间。你不会像在第二个屏幕截图中那样出现问题

例如:

mainLayout.setSizeConstraint(QLayout::SetFixedSize);

这正是我在mu项目中所做的。 分辨率并不重要。我只需要有一个用于渲染视频或图像的小部件

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();

 }
}
当您希望始终保持小部件的大小不变时,QLayout::setSizeConstraint(QLayout::SetFixedSize)很好地解决了这个问题——也就是说,如果您希望它始终固定为其“打包”大小(这可能仍然随子小部件大小的变化而变化)。这就是“固定”的意思:“固定”到正确的大小,即使后者有所不同。(在Qt术语中,我所说的“打包”大小只是小部件的大小限制。)

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


请注意,如果其子级正在更改大小的容器不是顶级窗口,则可能必须对容器及其父级递归调用adjustSize()。(无论如何,在我的例子中,我必须这样做。我还尝试了大小约束方案,发现仅在最顶层应用约束可以成功压缩所有级别。我没有足够的Qt知识对这些观察结果进行有用的评论,所以我只与大家分享。)

谢谢,我将在几分钟后尝试。事实上,有许多不同的分辨率组合,从320x240到1280x1024。它最多需要10种尺寸的配置。Qt无法自动执行此操作吗?我没有测试它,但您可以尝试只存储最小大小(甚至提供空大小)。如果我是正确的,QT应该自动将窗口大小增加到最小值,以显示包含的所有widgetsThank!这节省了我另外几个小时的搜索和调试由这个可怕的命名。为什么SetFixedSize意味着“自动调整大小到最小大小”,这在语义上不是一个固定大小,因为最小大小取决于小部件内容的大小(可能是动态的)?对此有什么解释吗?这个名字没有什么意义,而且我已经有一段时间没有使用Qt了,所以我不记得是怎么发现的。但这个问题困扰了我一段时间。很高兴它对您有所帮助这似乎适用于除QScrollara小部件之外的所有产品。您知道解决方案吗?nvm,我发现我可以将其设置为忽略,并让子部件的大小策略决定大小(请参阅此处的最后一个响应:)nvm nvm,它不再扩展以适应子内容。也许我需要问一个单独的问题…我遇到了一个问题,小部件树中的小部件向下调整了大小,但顶部的小部件没有更新其大小。解决方案是在这个调整大小的小部件中发出一个自定义信号,并使用
Qt::QueuedConnection
将其连接到主窗口中的一个自定义插槽。然后,此插槽只需调整大小(sizeHint())。