如何均匀分配QSplitter的宽度

时间:2017-05-07 12:30:45

标签: qt qt-designer

调整QSplitter的宽度时遇到问题。我在Qt Designer中准备了UI,它现在看起来像那样:

设计师视图

enter image description here

这是我的对象检查器

enter image description here

我的问题是如何在左右区域上平均分配QSplitter的宽度。我希望将此效果作为初始大小,然后客户可以做任何他想做的事情。

我想要的效果如下:

enter image description here

在其他世界中,我正在寻找一种方法来指定左右区域的分割器初始分割为窗口宽度的50%/ 50%。有没有选择去获得它?

感谢您的帮助,请原谅,我刚刚开始学习Qt。

3 个答案:

答案 0 :(得分:12)

简短回答

splitter->setSizes(QList<int>({INT_MAX, INT_MAX}));

<强>解释

在这种情况下,您不需要QSpacer。垫片的目标是填补所有可用空间。

QSplitter提供了两种指定子项大小的方法:setStretchFactorsetSizes

  • 虽然拉伸系数似乎是您要指定的子窗口小部件的相对大小,但它的缺点是因为这些因素是相对于初始大小的儿童小部件:
  

拉伸不是有效的伸展因子;有效伸展   通过获取小部件的初始大小来计算因子   将其乘以拉伸

因此,将两个孩子的伸展因子设置为相同的值(例如1)将无效:

splitter->setStretchFactor(0, 1);
splitter->setStretchFactor(1, 1);
  • 更好的选择是使用 setSizes ,因为只有相对大小才重要:
  

拆分器小部件的整体大小不受影响。相反,任何   根据小部件分配额外/缺失的空间   相对于尺寸的相对重量。

因此,人们可以认为将两种尺寸设置为1会使两个孩子的总体大小相等:

splitter->setSizes(QList<int>({1, 1}));

不,因为您应该考虑通过用最小尺寸替换太小的值来强制执行最小尺寸策略:

  

保留小部件的大小策略。也就是说,一个价值   小于相应小部件的最小尺寸提示   取而代之的是提示值。

因此,您应该使用一个大于您孩子最小尺寸的值,例如可以用int表示的最大数字,即INT_MAX

splitter->setSizes(QList<int>({INT_MAX, INT_MAX}));

进一步阅读

大部分时间,Qt都能很好地为所有小部件提供合适的大小,但调整它可能会变得非常困难,需要一些试验和错误。因此,我想提供一些在Qt中使用布局管理时可能有用的额外资源:

答案 1 :(得分:1)

基于m7913d's

要使用QSplitter::setSizes等分分割器,列表中的每个大小都应相等。使用QWidget::minimumSizeHint()确定要使用的大小。使用添加到拆分器中的每个小部件的最大宽度(用于水平拆分器)或最大高度(用于垂直拆分器)

// Example for a horizontal splitter
splitter = new QSplitter(Qt::Horizontal, this);
splitter->addWidget(widgetLeft);
splitter->addWidget(widgetRight);
auto equalWidth = std::max(widgetLeft->minimumSizeHint().width(), 
                           widgetRight->minimumSizeHint().width());
splitter->setSizes({ equalWidth, equalWidth });
// Example for a vertical splitter
splitter = new QSplitter(Qt::Vertical, this);
splitter->addWidget(widgetTop);
splitter->addWidget(widgetBottom);
auto equalHeight = std::max(widgetTop->minimumSizeHint().height(),
                            widgetBottom->minimumSizeHint().height());
splitter->setSizes({ equalHeight, equalHeight });

答案 2 :(得分:1)

我建议进一步修改。 m7913d的要点全部成立并且很重要。但是对于我的情况(Qt5.13.2),我发现设置足够大的尺寸可能会仍然导致某些变化。我不知道为什么会这样,但是将所有拉伸因子设置为另外一个 最终表现出了我想要的效果。

还要注意,将所有拉伸因子设置为1,但使用setSizes大小不相等(但仍然足够大以避免最小尺寸限制)也是可行的!例如:

splitter->setStretchFactor(0,1);
splitter->setStretchFactor(1,1);
splitter->setSizes({static_cast<int>(10000 / 1.618), static_cast<int>(10000 - 10000 / 1.618)});

设置黄金分割比例。