BoxLayout 中 QLabel 和 QCheckBox 的对齐给出了意想不到的结果
Allignment of a QLabel and a QCheckBox in a BoxLayout gives unexpected result
当我将 QLabel
和 QCheckBox
添加到 QVBoxLayout
或 QHBoxLayout
时,我希望它们分布均匀,但复选框会紧密对齐在最底部(在上面的示例中),标签将以小部件中生成的 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 QCheckBox
es 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(QCheckBox
es 无法占据。
因此,为了将所有小部件设置为 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);
这样 QSpacerItem
s 将占用所有额外的 space。
当我将 QLabel
和 QCheckBox
添加到 QVBoxLayout
或 QHBoxLayout
时,我希望它们分布均匀,但复选框会紧密对齐在最底部(在上面的示例中),标签将以小部件中生成的 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 QCheckBox
es 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 sizesizeHint()
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 asQLineEdit
,QSpinBox
or an editableQComboBox
) and other horizontally orientated widgets (such asQProgressBar
).
目前,您的 QLabel
有首选高度,而两个 QCheckBox
都有固定高度。这意味着 QLabel
将自动展开以占据任何额外的垂直 space(QCheckBox
es 无法占据。
因此,为了将所有小部件设置为 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);
这样 QSpacerItem
s 将占用所有额外的 space。