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

时间:2014-10-08 12:07:41

标签: qt pointers layout 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);

第二个:

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

1 个答案:

答案 0 :(得分:8)

在第一个分段中创建QVBoxLayout vbox; 一旦方法执行完成,它就会被销毁。

在第二个段中QVBoxLayout* box是在堆中创建的,并且在小部件存活之前它不会被销毁。

Qt中的布局在显示或调整窗口小部件时起作用,这就是为什么它们应该存在直到窗口小部件存在。

更多信息:
The stack and the heap
Blocks and local variables