2017-04-24 24 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指针作为父参数传递给构造函数)。