当我点击一个按钮时,我需要打开一个新的QMainWindow。我会理解为什么它与指针一起使用并且不能用于引用:
触发新窗口的插槽如下,它应该打开两个窗口,但只显示使用new运算符创建的窗口:
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 :(得分:2)
这不起作用:
MyWin win1(this);
win1.show();
因为它在堆栈上创建了win1
对象,所以win1
对象在当前作用域的末尾被销毁,然后才能实际绘制它。
这有效:
MyWin *win2 = new MyWin(this);
win2->show();
因为对象是在堆上分配的,并且它的生命周期不会在当前作用域结束,所以当你在其上调用delete的地址(win2
指针时,它就会结束,只保存对象的地址,而不是实际的对象),或者在您的情况下父将调用delete(因为您将this
指针作为父参数传递给构造函数)。