QT+模態對話框與非模態對話框


#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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM