当对话框调整大小时,我希望我的自定义小部件可以获得额外的空间。当我只有少量小部件时,这是有效的,但是在添加了几列相同小部件并将它们放入QGridLayout后,额外的空间仅作为小部件之间的填充。
当对话框调整大小时,我希望我的自定义小部件可以获得额外的空间。当我只有少量小部件时,这是有效的,但是在添加了几列相同小部件并将它们放入QGridLayout后,额外的空间仅作为小部件之间的填充。
我曾经遇到过这个问题,以下是我发现的一些解决方法:
首先确保所有想要展开的控件都设置了"Expanding"大小策略。
确保组成自定义控件的控件位于允许扩展的布局中。您可以通过将自定义控件添加到窗口中并查看其是否按预期展开来检查此项。
确保表单中您不想展开的任何控件在您希望它们保持静态的维度上具有固定(最小=最大)大小。
有时网格布局会导致一些奇怪的间距问题,因为行是基于整个行中最大的控件而调整大小,列也是如此。对于某些布局,最好使用包含水平布局或垂直布局的垂直布局或反之亦然来创建类似网格的效果。只有这样,每个子布局才能独立于其他行或列进行定位。
以编程方式控制网格扩展
我发现可以使用QGridLayout::setColumnStretch()
和QGridLayout::setRowStretch()
来轻松控制哪些列/行会扩展,哪些列/行会保持固定的宽度。您需要为特定的列提供权重(0表示不需要任何扩展)。
例如,如果要使列0不占用任何空间,并且列1占据整个窗口的宽度,请执行以下操作:
QGridLayout* layout ;
// Set up the layout
layout->setColumnStretch( 0, 0 ) ; // Give column 0 no stretch ability
layout->setColumnStretch( 1, 1 ) ; // Give column 1 stretch ability of ratio 1
使用Qt Designer控制网格扩展
如果你正在使用Designer,可以按照我上面描述的方式进行操作。只需要查找小部件属性layoutRowStretch和layoutColumnStretch。它将包含一个逗号分隔的整数列表。
另一个选项是在QT Creator中,在您想要固定大小的部分的顶级布局小部件中指定“SetFixedSize”的layoutSizeConstraint。您还必须从该小部件下方删除所有间隔器。在我的情况下,我有一个带有TreeWidget、Table和一些颜色选择控件的对话框。我希望颜色选择控件在水平方向上保持相同的大小,因此它们位于VerticalLayout中。如果您希望物品保持相同的高度,我想您也可以使用HorizontalLayout来实现相同的效果。如果您真的需要在布局中使用间隔器,您可能可以使用具有固定大小的空标签。