splitter->setSizes(QList<int>({INT_MAX, INT_MAX}));
注意:如果您想使用其他比例,微调部分可能包含必要的信息。
QSpacer
?不需要。在这种情况下,您不需要使用QSpacer
。空间占位符的目标是填充所有可用空间。
QSplitter
提供了两种方法来指定其子项的大小:
QSplitter::setStretchFactor
?不适用。虽然拉伸系数似乎是您希望指定子窗口小部件相对大小的内容,但对于您的情况,它具有缺点,即系数相对于子窗口小部件的初始大小:
stretch 不是有效的拉伸因子;有效的拉伸因子是通过取小部件的初始大小并将其乘以 stretch 来计算的。
因此,将两个子窗口小部件的拉伸系数设置为相同的值(例如1
)将不起作用:
splitter->setStretchFactor(0, 1);
splitter->setStretchFactor(1, 1);
QSplitter::setSizes
?是的。更好的选择是使用setSizes
,因为只有相对大小才有关系:
拆分器窗口部件的总体大小不受影响。 相反,任何多余/缺失的空间都按照大小的相对权重分配给小部件。
因此,可以认为将两个大小都设置为一个将在两个子项之间均匀分配总大小:
splitter->setSizes(QList<int>({1, 1}));
不行,因为你应该考虑到最小尺寸策略会通过用最小尺寸替换太小的值来执行:
控件的大小策略保持不变。也就是说,比相应控件的最小大小提示更小的值将被替换为提示值。
所以,你应该使用一个比你的子控件的最小尺寸大的值,例如可以用 int
表示的最大数,即 INT_MAX
:
splitter->setSizes(QList<int>({INT_MAX, INT_MAX}));
正如评论中所建议的那样,INT_MAX
可能会导致一些溢出问题,这取决于Qt对这些值进行的计算。 如果您想要非等分布比率,可能特别如此。 因此,一个更明智的大值可能是桌面宽度/高度。
// Horizontal splitter
int largeWidth = QGuiApplication::primaryScreen ()->virtualSize ().width ();
splitter->setSizes(QList<int>({largeWidth , largeWidth}));
// Vertical splitter
int largeHeight = QGuiApplication::primaryScreen ()->virtualSize ().height ();
splitter->setSizes(QList<int>({largeHeight , largeHeight}));
大多数情况下,Qt 会为所有小部件提供适当的大小,但微调可能变得非常困难,需要进行一些试验和错误。因此,我想提供一些额外的资源,这些资源可能在使用 Qt 中的布局管理时有用:
基于 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 });
// 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 });
splitter->setStretchFactor(0,1);
splitter->setStretchFactor(1,1);
splitter->setSizes({static_cast<int>(10000 / 1.618), static_cast<int>(10000 - 10000 / 1.618)});
QSizePolicy :: Policy
(分别设置为Maximum
/Preferred
和MinimumExpanding
)是否更合适? - m7913d