如何正确使用QLayouts(hbox,vbox等)?

How to properly use QLayouts (hbox, vbox, etc)?

本文关键字:vbox hbox 何正确 QLayouts      更新时间:2023-10-16

我正在构建一个基于QGraphicsWidget的自定义小部件

在小部件内部,我需要与窗口大小一致的各种其他小部件。为此,我正在使用

Layout = new QGraphicsLinearLayout();
Layout->setOrientation(Qt::Horizontal);
setLayout(Layout);

所以我有一个布局,在布局的每一侧我都有一个小部件。所以左边有一个小部件,右边有一个小部件。

QGraphicsLinearLayout() below
500 px wide x
|--------------------------------| 
|                                |
|left widget         right widget|   100 px tall y
|--------------------------------|

我想要这样的行为,即当窗口变大时,小部件保持在边缘的 x 像素内。因此,如果要将窗口大小调整为 10,000 像素宽,则左侧微件将始终距左边缘 1 个像素,右侧微件将始终距右边缘 1 个像素。

10000 px wide x
|---------------------------------------------------| 
|                                                   |
|left widget                            right widget|   100 px tall y
|---------------------------------------------------|

当前的行为是左小部件将保持在原位并且永远不会移动,而右小部件将从右边缘移开。

为了实现此行为,我尝试了以下方法:

Layout->setAlignment(leftWidget, Qt::AlignLeft);

这绝对无济于事。

我也试过

Layout->addItem(leftWidget);
Layout->setStretchFactor(leftWidget, 0);
Layout->addItem(rightWidget);

这给出了所需的效果,但像这样与边框重叠了 rightWidget

500 px wide x
|--------------------------------| 
|                                |
|left widget                 right widget   100 px tall y
|--------------------------------|

那么我怎样才能获得我想要的行为呢?QLayouts似乎非常令人困惑,到目前为止,API具有误导性。

解决方案

在左右小部件之间使用 QGraphicsLinearLayout::addStretch 以使它们保持在两侧,并使用 QGraphicsLayout::setContentMargins 在小部件和边缘之间添加空格:

auto *l = new QGraphicsLinearLayout();
l->addItem(leftProxy);
l->addStretch();
l->addItem(rightProxy);
l->setContentsMargins(25, 1, 1, 1);
l->setSpacing(1);

我为您准备了一个如何使用建议的解决方案的最小示例:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
auto *view = new QGraphicsView(this);
auto *widget = new QWidget();
auto *leftWidget = new QPushButton(tr("Left"));
auto *rightWidget = new QPushButton(tr("Right"));
auto *leftProxy = new QGraphicsProxyWidget();
auto *rightProxy = new QGraphicsProxyWidget();
auto *l = new QGraphicsLinearLayout();
auto *sizeGrip = new QSizeGrip(widget);
leftWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
rightWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
widget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
widget->setMinimumSize(sizeGrip->sizeHint().width()
+ leftWidget->sizeHint().width()
+ rightWidget->sizeHint().width(),
leftWidget->sizeHint().height());
leftProxy->setWidget(leftWidget);
rightProxy->setWidget(rightWidget);
l->addItem(leftProxy);
l->addStretch();
l->addItem(rightProxy);
l->setContentsMargins(25, 1, 1, 1);
l->setSpacing(1);
view->setScene(new QGraphicsScene(this));
view->scene()->addWidget(widget)->setLayout(l);
widget->resize(400, 200);
setCentralWidget(view);
resize(640, 480);
}