为什么接下来的两个代码序列表现不同?

Hél*_*ène 0 layout qt pointers reference overlapping

我不明白为什么第一个代码序列创建一个元素重叠的QWidget,而第二个代码序列行为正确.唯一的区别是,在第一个中有一个QVBoxLayout指针,而在第二个中它是一个对象.它是关于通过引用传递vs通过指针传递?我真的没有得到微妙的区别.

第一:

QVBoxLayout vbox;
vbox.setSpacing(2);

QPushButton* quitButton = new QPushButton("Qsdfsuit");
QFont fnt = quitButton->font();
fnt.setPointSize(18);
fnt.setBold(true);
fnt.setFamily("Arial");
quitButton->setFont(fnt);

connect(quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));

QLCDNumber* lcd = new QLCDNumber(2);

QSlider* slider = new QSlider(Qt::Horizontal);
slider->setRange(0, 99);
slider->setValue(0);

connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

vbox.addWidget(quitButton);
vbox.addWidget(lcd);
vbox.addWidget(slider);

this->setLayout(&vbox);
Run Code Online (Sandbox Code Playgroud)

第二个:

QVBoxLayout* vbox = new QVBoxLayout();
vbox->setSpacing(2);

QPushButton* quitButton = new QPushButton("Qsdfsuit");
QFont fnt = quitButton->font();
fnt.setPointSize(18);
fnt.setBold(true);
fnt.setFamily("Arial");
quitButton->setFont(fnt);

connect(quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));

QLCDNumber* lcd = new QLCDNumber(2);

QSlider* slider = new QSlider(Qt::Horizontal);
slider->setRange(0, 99);
slider->setValue(0);

connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

vbox->addWidget(quitButton);
vbox->addWidget(lcd);
vbox->addWidget(slider);

this->setLayout(vbox);
Run Code Online (Sandbox Code Playgroud)

Eze*_*zee 8

QVBoxLayout vbox;堆栈上创建第一个段.
一旦方法执行完成,它就会被销毁.

在第二个段中QVBoxLayout* box是在堆中创建的,并且在窗口小部件处于活动状态之前不会销毁它.

Qt显示或调整窗口小部件时,布局可以完成它们的工作,这就是为什么它们应该存在直到窗口小部件存在.

更多信息:
堆栈和堆
块和局部变量