为什么在Qt 5.2中,FlowLayout的行为与Qt 4.8有所不同?

26

我刚刚将我的应用程序从Qt 4.8.4迁移到了Qt 5.2.1。我在Qt文档中FlowLayout示例代码提供的FlowLayout类上遇到了一个问题。

我有一个QMainWindow,其中包含一个停靠在中央窗口底部的QDockWidgetQDockWidget具有几个子窗口小部件的FlowLayout。在Qt 4.8中,这很完美地工作,子窗口小部件的大小适合DockWidget的标准大小。然而,在Qt 5.2中,DockWidget试图增加其大小到最大(占用中央窗口的位置)。更改其布局可以防止此不良行为。但是,我当然是有目的地使用FlowLayout的。

为了说明问题,我创建了一个最简示例:

DockWidget的构造函数:

    QGroupBox *generalBox = new QGroupBox("");
    generalBoxLayout = new FlowLayout;
    generalBox->setLayout(generalBoxLayout);

    for(int i=0; i<10; ++i)
    {
        QPushButton *button = new QPushButton("Test", this);
        button->setMinimumWidth(100);
        button->setMinimumHeight(100);
        generalBoxLayout->addWidget(button);
    }

    this->setWidget(generalBox);

请问有人知道问题出在哪里以及我该如何解决吗?

编辑 我创建了一个新的最小工作示例,不幸的是无法重现 Qt 4.8 和 Qt 5.2 之间的差异。同样的问题也出现在 Qt 4.8 中,因此我仍然想在这里提出:

初始视图显示底部停靠的 dockwidget 占用了整个垂直空间: Initial view showing the bottom-docked dockwidget

使用鼠标调整 dockwidget 大小后的视图: View after resizing the dockwidget with the mouse

使用鼠标调整主窗口大小后的视图: View after resizing the mainwindow with the mouse

这些截图显示,在手动更改 dockwidget 的大小后,dockwidget 的行为符合预期。但是,在初始化时,该小部件占用中心窗口的所有可用空间,这是不希望的。

有没有人知道解决方案/变通方法?


2
我尝试过Qt 4.8.1、5.0.1和5.2.1,但没有注意到任何区别。你需要粘贴一些屏幕截图来解释问题所在。 - Marek R
我已经创建了一个新的最小工作示例,但令人尴尬的是,无法重现原始问题。对我来说,这仍然是意外的行为。我已经通过截图扩展了我的问题。 - c_k
3
我现在理解问题了。我进行了一些实验和研究,看起来是Qt中的一些错误。在我的情况下,FlowLayout::heightForWidth总是以相同的width值(在这种情况下为103)调用,与主窗口大小无关,这导致高度比期望的要高(通常窗口要宽得多)。当主窗口的宽度发生变化时,它也没有被调用(它应该更新停靠区域的高度)。 - Marek R
在我的情况下,宽度值为1072(虽然QMainWindow的大小为600x400)。FlowLayout::heightForWidth在初始化时被调用两次。在调整QMainWindow或QDockWidget的大小时,它不会再次被调用。似乎让FlowLayout::hasHeightForWidth()返回false是我的一种解决方法,但并不是一个很好的解决方案。你说的是某个错误,有文档记录吗? - c_k
6
@MarekR 你应该把你的评论作为答案并接受它。否则,这个问题将成为未回答的qt5问题列表中的头号问题,由于没有任何答案(无论是已经被接受还是未接受的),人们可能不会查看它(也就找不到解决方案)。 - Bigwave
1个回答

4
这是Marek R提出的答案。我把它放在这里,以便这个问题得到回答。长期以来,它一直伪装成一个未回答的问题。

我现在看到了问题。我进行了一些实验和研究。看起来是Qt中的某些bug。无论主窗口大小如何,FlowLayout::heightForWidth始终使用相同的width值(在我的情况下为103),这导致高度比期望的要大(通常窗口要宽得多)。而且,在主窗口的宽度改变时,它也不会被调用(它应该更新停靠区域的高度)。


它确实回答了问题的第一部分。我从未将其添加为答案,因为解决方案部分没有得到回答。但是我同意现在称其为答案是有道理的。 - c_k
这个 bug 已经在 Qt 团队的某个地方报告了吗? - bparker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接