调整QSplitter
的宽度时遇到问题。我在Qt Designer中准备了UI,它现在看起来像那样:
设计师视图:
这是我的对象检查器:
我的问题是如何在左右区域上平均分配QSplitter
的宽度。我希望将此效果作为初始大小,然后客户可以做任何他想做的事情。
我想要的效果如下:
在其他世界中,我正在寻找一种方法来指定左右区域的分割器初始分割为窗口宽度的50%/ 50%。有没有选择去获得它?
感谢您的帮助,请原谅,我刚刚开始学习Qt。
答案 0 :(得分:12)
简短回答:
splitter->setSizes(QList<int>({INT_MAX, INT_MAX}));
<强>解释强>
在这种情况下,您不需要QSpacer
。垫片的目标是填补所有可用空间。
QSplitter
提供了两种指定子项大小的方法:setStretchFactor
和setSizes
:
拉伸不是有效的伸展因子;有效伸展 通过获取小部件的初始大小来计算因子 将其乘以拉伸。
因此,将两个孩子的伸展因子设置为相同的值(例如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)});
设置黄金分割比例。