4

我正在尝试创建一个可停靠的工具栏(类似于您在 Photoshop 中使用的工具),它将容纳一个 2 x (n) 网格的按钮。我的想法是使用一个 QGridLayout 父级到一个空白 QWidget,它被添加到一个 QDockWidget,并添加按钮到 QGridLayout。除了对齐之外,这似乎有效。

我已经为按钮设置了对齐...

myLayout->addWidget(button1,0,0,1,1,Qt::AlignTop);
myLayout->addWidget(button2,0,1,1,1,Qt::AlignTop);
myLayout->addWidget(button3,1,0,1,1,Qt::AlignTop);
myLayout->addWidget(button4,1,1,1,1,Qt::AlignTop);

...但是网格正在扩展到 QDockWidget 的整个高度,如下所示: 在此处输入图像描述

按钮也在水平扩展,以填充整个空间。我想我可以限制水平重新调整大小的能力(如果可能的话?)。

我在文档中忽略了一个函数来更好地控制 GridLayout 以限制它填充父小部件的整个宽度/高度?作为一个附带问题,有没有办法防止 QDOckWidget 被重新调整到某个方向?

4

3 回答 3

4

文档中

QGridLayout获取可用的空间(通过其父布局或通过 parentWidget()),将其划分为行和列,并将其管理的每个小部件放入正确的单元格中。

列和行的行为相同;我们将讨论列,但行也有等效的功能。

每列都有一个最小宽度和一个拉伸因子。最小宽度是使用 setColumnMinimumWidth() 设置的最大宽度以及该列中每个小部件的最小宽度。拉伸因子是使用 setColumnStretch() 设置的,并确定列将获得多少可用空间超过其必要的最小值。

所以最简单的方法是使用固定大小的可停靠小部件QWidget::setFixedSize。一般来说,我不会推荐它(管理布局),但它非常适合您的情况,原因如下:

  • 所有按钮的大小都相同,因此您大致了解工具栏的大小,具体取决于按钮的数量。
  • 您不需要管理布局行为。
  • 你可以用任何一个维度来做,或者两者都做

例如,添加按钮时

  void addButton(QWidget* w,QGridLayout* wl, QButton* button, posParams...){
       // w is the widget inside the QDockWidget (edit)
       //wl is w layout
       //break the constraints, the widget can be resized
       w->setFixedSize(QSize(QWIDGETSIZE_MAX,QWIDGETSIZE_MAX));
       // only line to change if you want to hide, remove widget
       wl->addWidget(button, params);
       //fit to contents 
       w->adjustSize();
       // can be swapped to w->setFixedHeight, setFixedWidth
       w->setFixedSize(w->size());
  }

尝试一下并验证在修改后停靠和取消停靠小部件时事情不会出错。您应该注意,打破约束也会打破布局。

通常QLayout::SizeConstraintQWidget::minimumSizeHintQWidget::minimumSize之间存在层次结构,您可以在文档中找到它。

  • QWidget::minimumSize默认情况下未设置。当它存在时,它占了上风 QWidget::minimumSizeHint
  • QWidget::minimumSizeHint如果小部件不在布局中,则无效(意味着可以用鼠标将其大小调整为 0),否则使用布局定义的那个。
  • QLayout::SizeConstraint保存它*直接*管理的小部件的默认布局行为。如果您在 layout 中嵌套A布局B,则添加到的所有小部件都A将使用其属性。此外,如果小部件定义WB自己的布局,则此布局约束将应用于小部件W
于 2012-02-06T10:19:21.023 回答
2

使用 QVBoxLayout ,首先添加 QGridLayout ,然后添加如下拉伸:

my_vboxlayout->addLayout( my_gridlayout );
my_vboxlayout->addStretch( 1 );

或者,您可以告诉您的 QGridLayout 最后一行应该扩展到最大尺寸,这将推动按钮。
在您的情况下,它将是:

mygridlayout->setRowStretch( 2, 1 ); // give 3rd row maximum space

文档链接:
QBoxLayout
QGridLayout

于 2012-02-06T10:20:11.467 回答
0

在下面插入一个垂直垫片。
在此处输入图像描述

于 2017-03-01T02:24:24.777 回答