Qt布局,传递和不传递QWidget作为父级之间的区别

时间:2017-03-03 21:06:15

标签: c++ qt

我创建了一个简单的QHBoxLayout(水平),它被推到QVBoxLayout(垂直)的底部,它包含两个按钮。见代码:

QWidget* create_ver_and_horizontal_box() {
    QWidget* temp = new QWidget();

    // Add buttons to the horizontal box
    QHBoxLayout* hbox = new QHBoxLayout();

    QPushButton *ok = new QPushButton("OK");
    QPushButton *cancel = new QPushButton("Cancel");

    hbox->addWidget(ok);
    hbox->addWidget(cancel);

    // Create a vertical box and add the horizontal box to 
    // the end of it
    QVBoxLayout* vbox = new QVBoxLayout();   
    vbox->addStretch(1);
    vbox->addLayout(hbox);

    // set the layout and return
    temp->setLayout(vbox);
    return temp;
}

,生成的UI如下。 enter image description here

但是当我将QWidget temp添加为QHBoxLayout的父级时,就像这样:

    // Add buttons to the horizontal box
    QHBoxLayout* hbox = new QHBoxLayout(temp);

这就是我得到的: enter image description here

我想了解这里发生了什么。在这种情况下,我希望QWidget成为布局或任何其他QWidget的父级,在这种情况下,我不会将包含的QWidget作为包含QWidgets的父级。例如,我可以添加temp作为两个Push按钮的父级,但我没有。不添加vs添加是什么意思。

谢谢,

1 个答案:

答案 0 :(得分:2)

QHBoxLayout* hbox = new QHBoxLayout(temp);

相当于

QHBoxLayout* hbox = new QHBoxLayout();
temp->setLayout(hbox);

即。你正在使水平布局负责temp

setLayout(vbox)的调用应该生成一个运行时警告消息,temp已经有了布局,暗示了这一点。

由于您希望垂直布局负责该窗口小部件,请保留temp->setLayout(vbox)或将temp传递给QVBoxLayout的构造函数。