2017-04-24 58 views
1

新幀我需要打開一個新的QMainWindow當我在button.I點擊會明白爲什麼它的工作原理與一個指針,並且不與基準工作:顯示使用Qt C++

觸發一個新的插槽窗口下面,就應該打開兩個窗口,但只有創建的窗口與新的運營商顯示出來:

MyWin win1(this); 
win1.show(); 
MyWin *win2 = new MyWin(this); 
win2->show(); 

以下是MyWin.h和MyWin.ccp

#ifndef MyWin_H 
#define MyWin_H 
#include <QMainWindow> 

namespace Ui { 
class FrmManipolo1; 
} 


Class MyWin : public QMainWindow 
Q_OBJECT 

public: 
    explicit MyWin(QMainWindow *parent = 0); 
    ~MyWin(); 

    private: 
    Ui::MyWin *ui; 
}; 

#endif 

MyWin.cpp

include "MyWin.h" 
include "ui_MyWin.h" 

MyWin::MyWin(QMainWindow *parent) : 
QMainWindow(parent), 
ui(new Ui::MyWin) 
{ 
    ui->setupUi(this); 
} 

MyWin::~MyWin() 
{ 
    delete ui; 
} 
+0

所以你試圖打開一個窗口,你沒有創建/實例化('新'),你想知道爲什麼?順便說一下指針*是一個引用。 – Rafalon

+0

爲什麼我沒有得到一個空指針異常?我認爲用第一個表示法會自動創建一個對象。因此沒有用MyWin win1創建對象(this);?我認爲這兩種方法都可以工作,但是第一個對象被放入堆棧,後者放在堆中 –

+2

它被創建,但是當'win1'變量超出範圍時它被銷燬。 – thuga

回答

2

這不起作用:

MyWin win1(this); 
win1.show(); 

,因爲它創建堆棧上的win1對象,所以win1對象在當前範圍的結尾被破壞,它實際上可以得出前。

這工作:

MyWin *win2 = new MyWin(this); 
win2->show(); 

,因爲對象是在堆上分配,它的生命週期,在當前範圍內並沒有結束,它結束當你調用刪除它的地址(win2指針,只有保存對象的地址,而不是實際的對象),或者父對象將調用delete(因爲您將this指針作爲父參數傳遞給構造函數)。