2014-10-08 45 views
0

我不明白爲什麼第一個代碼序列創建一個QWidget,其中元素重疊,而第二個代碼行爲正確。 唯一的區別是在第一個中有一個QVBoxLayout指針,而在第二個中是一個對象。 這是關於通過引用傳遞與傳遞指針?我真的沒有得到微妙的差異。爲什麼接下來的兩個代碼序列的行爲不同?

第一個:

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

它已經講過,但是需要再次說:Qt的前_Learn C++ _ – cmannett85 2014-10-09 06:51:52

回答

8

在第一段QVBoxLayout vbox;在堆棧上創建。
只要方法執行完成,它就會被銷燬。

在第二段QVBoxLayout* box在堆中創建,它不會被銷燬,直到該小部件處於活動狀態。

Qt中的佈局在顯示或調整窗口小部件時會執行它們的工作,這就是爲什麼它們應該存在直到存在窗口小部件。

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

+0

「如果完成它即被銷燬的方法執行。」 - 你的意思是構造函數?假設上面的代碼在QWidget的構造函數中。 – 2014-10-08 12:23:39

+1

是的,獨立地使用什麼方法 - 一個構造函數或任何其他方法 - 所有局部變量在完成時都會被銷燬。 – Ezee 2014-10-08 12:32:55

+1

如果你通過將'QVBoxLayout vbox;'放入它的'private'部分來創建widget類的成員,在這種情況下它將起作用。它將一直活着,直到調用該小部件的內部析構函數。 – Ezee 2014-10-08 12:36:54

相關問題