33

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

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

我玩过sizePoliciesand sizeHints, and resize(0,0),但没有成功。有人可以帮我解决这个问题吗?

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

在这里,一切都好 尽管如此,640 x 480 可以完美调整大小 但是在这里,布局太大了。

4

4 回答 4

59

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

例子:

mainLayout.setSizeConstraint(QLayout::SetFixedSize);
于 2014-01-30T14:13:32.190 回答
10

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

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

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

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

于 2015-11-26T05:05:26.540 回答
2

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

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

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

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

当您完成将小部件重组为紧凑尺寸时

this->window().resize(minimumWindowSize);
于 2013-02-20T13:19:58.897 回答
1

这正是我在 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();

 }
}
于 2014-02-18T09:15:02.967 回答