BoxLayout 中 QLabel 和 QCheckBox 的对齐给出了意想不到的结果

Allignment of a QLabel and a QCheckBox in a BoxLayout gives unexpected result

当我将 QLabelQCheckBox 添加到 QVBoxLayoutQHBoxLayout 时,我希望它们分布均匀,但复选框会紧密对齐在最底部(在上面的示例中),标签将以小部件中生成的 free space 为中心。我如何更改此行为以均匀分布所有 3 个小部件?

非常感谢。

这是示例代码:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    QLabel* l = new QLabel("Hi");
    QCheckBox* c = new QCheckBox("Label");
    QCheckBox* c2 = new QCheckBox("Label");
    l->setText("Hi");
    QVBoxLayout* v = new QVBoxLayout;

    v->addWidget(l);
    v->addWidget(c);
    v->addWidget(c2);
    setLayout(v);
    ui->setupUi(this);
}

这是结果:

看看QSizePolicy. You need to setSizePolicy for your QLabel and QCheckBoxes to be QSizePolicy::Preferred, from the docs:

The default policy is Preferred/Preferred, which means that the widget can be freely resized, but prefers to be the size sizeHint() returns. Button-like widgets set the size policy to specify that they may stretch horizontally, but are fixed vertically. The same applies to lineedit controls (such as QLineEdit, QSpinBox or an editable QComboBox) and other horizontally orientated widgets (such as QProgressBar).

目前,您的 QLabel 有首选高度,而两个 QCheckBox 都有固定高度。这意味着 QLabel 将自动展开以占据任何额外的垂直 space(QCheckBoxes 无法占据。

因此,为了将所有小部件设置为 Preferred 高度,您需要将以下内容添加到构造函数中:

l->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
c->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
c2->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

另一种选择是 add spacers 围绕每个小部件,如下所示:

v->addStretch();
v->addWidget(l);
v->addStretch();
v->addWidget(c);
v->addStretch();
v->addWidget(c2);
v->addStretch();
setLayout(v);

这样 QSpacerItems 将占用所有额外的 space。