我有一个有两个堆叠层的小部件。第一个看起来是这样的,很好:

第二个看起来是这样的,这是错误的。

下面是生成小部件并打印大小策略的完整代码。
#include <QtWidgets>
int main (int argc, char ** argv)
{
QApplication app (argc, argv);
QWidget w;
auto stack = new QStackedWidget ();
QWidget * labelbox = new QWidget ();
QWidget * combobox = new QComboBox ();
QWidget * label = new QLabel ("Label");
QWidget * button = new QPushButton ("Button");
QWidget * date = new QDateTimeEdit ();
auto gl = new QGridLayout (& w);
auto hl = new QHBoxLayout (labelbox);
hl -> addWidget (label);
hl -> addWidget (button);
stack -> addWidget (labelbox);
stack -> addWidget (combobox);
stack -> setCurrentIndex (1); // 0 is the good layer, 1 is the bad
gl -> addWidget (date);
gl -> addWidget (stack, 0, 1);
w .setMinimumSize (300, 200);
w .show ();
for (auto x : {(QWidget *) stack, labelbox, combobox, label, button, date})
{
qWarning ()
<< x -> metaObject () -> className ()
<< x -> sizePolicy ();
}
return app .exec ();
}标准如下:
QStackedWidget QSizePolicy(horizontalPolicy = 5, verticalPolicy = 5)
QWidget QSizePolicy(horizontalPolicy = 5, verticalPolicy = 5)
QComboBox QSizePolicy(horizontalPolicy = 5, verticalPolicy = 0)
QLabel QSizePolicy(horizontalPolicy = 1, verticalPolicy = 5)
QPushButton QSizePolicy(horizontalPolicy = 1, verticalPolicy = 0)
QDateTimeEdit QSizePolicy(horizontalPolicy = 1, verticalPolicy = 0)这些值的文档如下:
QSizePolicy::Fixed = 0 The QWidget::sizeHint() is the only acceptable alternative, so the widget can never grow or shrink (e.g. the vertical direction of a push button).
QSizePolicy::GrowFlag = 1 The widget can grow beyond its size hint if necessary.
QSizePolicy::ExpandFlag = 2 The widget should get as much space as possible.
QSizePolicy::ShrinkFlag = 4 The widget can shrink below its size hint if necessary.
QSizePolicy::IgnoreFlag = 8 The widget's size hint is ignored. The widget will get as much space as possible.所以看起来垂直大小策略是Fixed,除了QStackedWidget,包含标签和按钮的QWidget,以及QLabel,它们都有GrowFlag|ShrinkFlag。
为什么QComboBox会垂直增长,尽管它有Fixed政策?为什么这种情况不会发生在QPushButton或QDateTimeEdit上?
这发生在Ubuntu15.04上的QT4.8和QT5.1中。
发布于 2015-08-25 10:17:53
您正在将组合框直接分配给QStackedWidget,但尚未首先将其添加到QLayout中。将其分配给布局,将此布局添加到QWidget,然后将此QWidget添加到QStackedWidget中。
示例:
QWidget * combowidget = new QWidget ();
QWidget * combobox = new QComboBox ();
auto vl = new QVBoxLayout (combowidget);
vl->addWidget(combobox);
stack->addWidget (combowidget);https://stackoverflow.com/questions/32200424
复制相似问题