#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