Qt布局:垂直方向默认大小约束,水平方向设置FixedSize



我正在开发一个具有复杂的小部件和布局层次结构的应用程序,但简而言之,它有一个中央小部件,其中公式集作为上部小部件,QScrollArea作为底部小部件(通过QVBoxLayout)。

QScrollArea表示QPushButton的列表(实际上是网格布局),它可以包含(或不包含)大量按钮。

我希望我的应用程序符合以下限制:

  • 两者(表单和列表)都消耗所有可用的水平空间,重新分配其内容以填充所有水平空间(也没有SpaceItem的内容页边距)
  • 两者都必须尽可能节省垂直空间,以便使"线"彼此靠近

我已经部分解决了在表单上使用setSizeConstraint(QLayout::SetFixedSize)的问题,它可以垂直收缩表单,也可以水平收缩表单,导致列表和表单都有不同的宽度,看起来不太好。

我怎样才能做到这一点?我的意思是,如何指定类似grow horizontally to fill the widget but shrink vertically has much as possible的内容?

添加一个间隔符作为布局的最后一项:

gridLayout->addItem(new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Expanding), lastrow, 0);

我想这就是你想要的:

如果您知道将有多少列(并且它不会改变),请在最后一列中插入Stretch()(尽管它可能会给您带来与使用间隔符相同的效果)。

int columnCount = gridLayout()->columnCount();
gridLayout->insertStretch( columnCount(), 1 ); // Default stretch for other

请注意,这会将按钮的大小调整为Qt认为应该的大小,除非您明确更改它们的宽度。