自定义QWidget布局问题

时间:2011-08-10 11:19:26

标签: qt4 qt-creator qwidget

我是QT的新手,我已经制作了我的第一个自定义QWidget子类......一切正常,直到我尝试添加一些标签。他们都被压扁到了角落里。

这是我的代码:

   ARView::ARView(QWidget *parent, const char *name) {
deviceLBL = new QLabel(this);
targetLBL = new QLabel(this);
deviceHeadingLBL = new QLabel(this);
targetHeadingLBL = new QLabel(this);
distanceLBL = new QLabel(this);

QVBoxLayout *layout = new QVBoxLayout();

layout->addWidget(deviceLBL);
layout->addWidget(targetLBL);
layout->addWidget(deviceHeadingLBL);
layout->addWidget(targetHeadingLBL);
layout->addWidget(distanceLBL);

this->setLayout(layout);

this->setupLocationUpdates();

}

有谁知道我做错了什么?为什么不是所有这些标签都放在网格中? 或者,如果它们是 - 为什么网格不使用我所有的子类的可用空间?

干杯,

詹姆斯

2 个答案:

答案 0 :(得分:1)

这个名字可能是骗人的,但QVBoxLayout不是网格布局。这是一个垂直框布局。这意味着它应该按照添加顺序从上到下排列项目。

所以你想要的实际上是一个QGridLayout。如果您查看这种布局的文档,您将看到以下功能:

void    addWidget ( QWidget * widget, int row, int column, Qt::Alignment alignment = 0 )
void    addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 )

这些应该允许您将小部件放在网格中的任何位置。

所以我在下面添加的代码将把deviceLBL和targetLBL放在第一行的第一行,deviceHeadingLBL和targetHeadingLBL,只是为了好玩,第三行的distanceLBL,但占用了2列空间。

QGridLayout *layout = new QGridLayout ();

layout->addWidget(deviceLBL, 0, 0);
layout->addWidget(targetLBL, 0, 1);
layout->addWidget(deviceHeadingLBL, 1, 0);
layout->addWidget(targetHeadingLBL, 1, 1);
layout->addWidget(distanceLBL, 2, 0, 1, 2);

这应该是这样的:

enter image description here

答案 1 :(得分:0)

创建窗口小部件后,需要将它们添加到网格布局中。

请参阅QGridLayout的addWidget()方法。