为什么与Qt4.8相比,Qt5.2中的FlowLayout表现不同?

为什么与Qt4.8相比,Qt5.2中的FlowLayout表现不同?,qt,qt4,qt5,flowlayout,qdockwidget,Qt,Qt4,Qt5,Flowlayout,Qdockwidget,我刚刚将我的应用程序从Qt4.8.4移植到Qt5.2.1。我对中提供的FlowLayout类有问题 我有一个QMainWindow,其中一个QDockWidget停靠在中央小部件的底部。 QDockWidget有一个带有多个子widget的FlowLayout。在Qt4.8中,这就像一个符咒,子窗口小部件的大小符合DockWidget的标准大小。但是,在Qt5.2中,DockWidget试图将其大小增加到最大值(从中央小部件取而代之)。更改其布局可以防止这种不必要的行为。当然,我是故意使用Flo

我刚刚将我的应用程序从Qt4.8.4移植到Qt5.2.1。我对中提供的
FlowLayout
类有问题

我有一个
QMainWindow
,其中一个
QDockWidget
停靠在中央小部件的底部。
QDockWidget
有一个带有多个子widget的
FlowLayout
。在Qt4.8中,这就像一个符咒,子窗口小部件的大小符合
DockWidget
的标准大小。但是,在Qt5.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);
QGroupBox*generalBox=newqgroupbox(“”);
generalBoxLayout=新的FlowLayout;
generalBox->setLayout(generalBoxLayout);
对于(int i=0;isetMinimumWidth(100);
按钮->设置最小高度(100);
generalBoxLayout->addWidget(按钮);
}
此->设置小部件(generalBox);
有人知道问题是什么吗?我如何解决

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

显示占据整个垂直空间的底部停靠dockwidget的初始视图:

用鼠标调整dockwidget大小后查看

用鼠标调整主窗口大小后查看

这些屏幕截图显示,在手动更改dockwidget的大小后,dockwidget的行为符合预期。但是,在初始化时,小部件从中心小部件获取所有可用空间,这是不需要的


有人知道解决方案/解决方法吗?

这是由给出的答案。我把它放在这里是为了让这个问题得到答案。太长时间以来,它一直伪装成一个未回答的问题


我现在明白问题了。我做了一些实验和研究。看起来 就像Qt中的一些bug一样。
FlowLayout::heightForWidth
总是被调用 在主窗口上独立使用相同的
宽度
值(在我的例子中是103) 尺寸和这导致高度大于所需的(通常窗口大得多) 更宽)。当主窗口的宽度改变时,也不调用它 (它应该更新码头区域的高度)


我确实在Qt 4.8.1、5.0.1、5.2.1上尝试过,但我没有注意到任何差异。你需要粘贴一些屏幕截图来解释问题所在。我创建了一个新的最小工作示例,但令人尴尬的是,无法重现原始问题。但对我来说,这仍然是意外的行为。我用屏幕截图扩展了我的问题。我现在明白了问题所在。我做了一些实验和研究。它看起来像是Qt中的一些错误。
FlowLayout::heightForWidth
总是使用相同的
width
值(在我的例子中是103)独立于主窗口大小调用,这导致高度大于所需的高度(通常窗口更宽)。当主窗口的宽度发生变化时,也不会调用它(假定它会更新停靠区的高度)。在我的例子中,宽度值是1072(但QMainWindow的大小是600x400)初始化时,
FlowLayout::heightForWidth
被调用两次。在调整
QMainWindow
QDockWidget
的大小时,不会再次调用它。似乎具有
FlowLayout::hasHeightForWidth()
return false对我来说是一个解决办法。但这不是一个很好的解决方案。你说的是某个bug,是否有文档记录?@MarekR你应该添加你的评论作为答案并接受它。否则,这个问题在未回答的qt5问题列表中排名第一,并且由于没有答案(接受或其他),人们可能不会看到这个问题(并找到解决方案)它确实回答了问题的第一部分。我从未将其作为答案添加,因为解决方案部分没有得到回答。但是我同意现在将其称为答案是有意义的。是否已向Qt团队报告了此错误?