【问题标题】:Show new frame with qt c++使用 qt c++ 显示新框架
【发布时间】:2017-04-24 09:52:17
【问题描述】:

当我点击一个按钮时,我需要打开一个新的 QMainWindow。我会理解为什么它可以与指针一起使用而不能与引用一起使用:

触发新窗口的槽如下,它应该打开两个窗口,但只显示使用新操作符创建的窗口:

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

【问题讨论】:

  • 所以你试图打开一个你没有创建/实例化的窗口 (new) 你想知道为什么?顺便说一句,指针引用。
  • 为什么我没有得到空指针异常?我认为使用第一个符号会自动创建一个对象。所以没有使用 MyWin win1(this); 创建对象?我想这两种方法都应该起作用,但是第一个方法将对象放入堆栈中,而后者则放入堆中
  • 它被创建,但是当win1变量超出范围时它被销毁。

标签: c++ qt window


【解决方案1】:

这不起作用:

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

因为它在堆栈上创建了win1 对象,所以win1 对象在当前作用域结束时被销毁,然后才可以实际绘制。

这行得通:

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

因为对象是在堆上分配的,并且它的生命周期不会在当前范围内结束,所以当你在它的地址上调用 delete 时它就会结束(win2 指针,它只保存对象的地址,而不是实际对象),否则父级将在您的情况下调用 delete(因为您将 this 指针作为父级参数传递给构造函数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多