如何均匀分配QSplitter的宽度

dre*_*pol 5 qt qt-designer

我有调整宽度的问题QSplitter.我在Qt Designer中准备了UI,现在看起来像这样:

设计师视图:

在此输入图像描述

这是我的对象检查员:

在此输入图像描述

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

我想要的效果如下:

在此输入图像描述

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

谢谢你的帮助,请原谅,我刚刚开始学习Qt.

m79*_*13d 18

简短回答:

splitter->setSizes(QList<int>({INT_MAX, INT_MAX}));
Run Code Online (Sandbox Code Playgroud)

说明

QSpacer在这种情况下你不需要.垫片的目标是填充所有可用空间.

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

  • 虽然拉伸因子可能看起来像您要指定子窗口小部件的相对大小,但它的缺点是因为这些因子是相对于子窗口小部件的初始大小:

拉伸不是有效的伸展因子; 的有效拉伸因子通过取小工具的初始尺寸,并与相乘来计算拉伸.

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

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

拆分器小部件的整体大小不受影响.相反,根据尺寸的相对权重,在小部件之间分配任何附加/缺失空间.

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

splitter->setSizes(QList<int>({1, 1}));
Run Code Online (Sandbox Code Playgroud)

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

小部件的大小策略将保留.也就是说,小于相应小部件的最小大小提示的值将被提示的值替换.

因此,您应该使用大于子项最小大小的值,例如可以用a表示的最大数字int,即INT_MAX:

splitter->setSizes(QList<int>({INT_MAX, INT_MAX}));
Run Code Online (Sandbox Code Playgroud)

进一步阅读

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


小智 6

基于m7913d的

要平均分配拆分器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 });
Run Code Online (Sandbox Code Playgroud)
// 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 });
Run Code Online (Sandbox Code Playgroud)