#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()<<"";
});
//非模态
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 = );
~MainWindow();
QDialog dlg;//自定义为全局变量(成员变量)
}; #endif // MAINWINDOW_H
05-11 19:53