简体   繁体   中英

Qt layouts, difference between passing and not passing QWidget as parent

I have created a simple QHBoxLayout (horizontal) that is pushed to the bottom of the QVBoxLayout (Vertical) and it contains two buttons. See code:

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;
}

and the resulting UI is the following. 在此处输入图片说明

But when I add the QWidget temp to be the parent of the QHBoxLayout, like so:

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

This is what I get: 在此处输入图片说明

I want to understand what is going on here. And in which cases I want the QWidget to be the parent of a layout or any other QWidget(s) and in which cases I don't the containing QWidget to be the parent of the containing QWidgets. For example, I could've added temp to be the parent of the two Push buttons but I didn't. What is the implication of not adding vs adding.

Thanks,

QHBoxLayout* hbox = new QHBoxLayout(temp);

is equivalent to

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

Ie you are making the horizontal layout responsible for temp .

The call to setLayout(vbox) should have generated a runtime warning message, that temp already has a layout, hinting at that.

Since you want the vertical layout to be responsible for that widget, either keep the temp->setLayout(vbox) or pass temp to the constructor of QVBoxLayout .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM