#include "mainwindow.h" #include <QMenuBar> #include <QMenu> #include <QAction> #include <QDialog> #include<QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QMenuBar *mBar = menuBar(); setMenuBar(mBar); QMenu *menu = mBar->addMenu("对话框"); //模态 QAction *p1 = menu->addAction("模态对话框"); connect(p1,&QAction::triggered,[=](){ QDialog dlg; dlg.exec(); qDebug()<<"111111"; }); //非模态 QAction *p2 = menu->addAction("非模态对话框"); connect(p2,&QAction::triggered,[=](){ /*使用如下代码的时候,会发现其窗口会一闪而过,这是因为这种方式是局部变量的方式,其顺序执行,并释放内存,所以就会一闪而过。 * QDialog dlg; * dlg.show(); * qDebug()<<"111111"; * */ /*为了防止其一闪而过,将其定义为成员变量 * 这种使用全局变量的方式,是最简单的,不用考虑内存泄漏的问题 * 即:将QDialog dlg;声明为全局变量,将其定义在mainwindow.h中类的成员变量。 * 再添加如下代码: * dlg.show(); * qDebug()<<"111111"; * / /*当然了,为了方便,如果非要使用局部变量的话,也是可以的,那就给他动态分配空间 * QDialog *p = new QDialog(this); * p->show(); * 但是这么写的有一个不好的地方,这种方法创建的窗口在程序结束的时候才会释放。 * 考虑一个极限,经常的点击这个按钮,就意味着这个程序不结束,程序就会动态的分配n多次的空间,这样就导致内存越用越少。 * 所以这里通常就不指定父对象: * QDialog *p = new QDialog; * p->show(); * 但是不指定父对象的话,就意味着不在对象树上,那么怎么释放它的对象呢? * 幸好,对话框有一个属性。即:p ->setAttribute(1); * 最终: * QDialog *p = new QDialog; * p ->setAttribute(1); * p->show(); */ QDialog *p = new QDialog; p ->setAttribute(Qt::WA_DeleteOnClose); p->show(); }); } MainWindow::~MainWindow() { }
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QDialog> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); QDialog dlg;//自定义为全局变量(成员变量) }; #endif // MAINWINDOW_H