Qt對話框QDialog


QDialog是Qt中所有對話框窗口的基類

當QWidget無父組件的時候作為一個獨立的窗口,有父組件的時候,將作為一個可見的部件嵌入到父組件里面。

QDialog不能作為子部件嵌入到其他容器中

 

對話框有模態、非模態兩種情況。

模態對話框:

對於參數選擇的對話框,一般用模態對話框;

顯示后不能夠和父窗口進行交互

是一種阻塞式對話框調用

 模態對話框通過調用exec()函數實現,使用模態對話框時,事件就在對話框內部循環,必須將對話框關閉才能繼續執行主界面的操作。

非模態:

對於顯示或查看某些內容的對話框,一般用非模態對話框。

顯示后獨立存在可以同時與父窗口進行交互

非阻塞式對話框調用

 非模態對話框調用show()函數實現

 

 

 

最后一個小技巧是設置該屬性表示關閉對話框的同時刪除對話框對象  就會將自己給釋放不會導致內存泄漏

 

 

 

 實例:創建一個面向對象的窗口,自己創建類class Dialog : public QDialog

  

#include <QApplication>
#include <QWidget>
#include <QDialog>
#include <QDebug>
#include "Dialog.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog dlg;
    dlg.show();
    return a.exec();
}

.h

#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QPushButton>
class Dialog : public QDialog
{
    Q_OBJECT
protected:
    QPushButton ModalBtn;
    QPushButton NormalBtn;
    QPushButton MixedBtn;
protected slots:
    void ModalBtn_Clicked();
    void NormalBtn_Clicked();
    void MixedBtn_Clicked();
public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
};
#endif // DIALOG_H

cpp

#include "Dialog.h"
#include <QDebug>
Dialog::Dialog(QWidget *parent) :
        QDialog(parent), ModalBtn(this), NormalBtn(this), MixedBtn(this)
{
    ModalBtn.setText("Modal Dialog");
    ModalBtn.move(20, 20);
    ModalBtn.resize(100, 30);
    NormalBtn.setText("Normal Dialog");
    NormalBtn.move(20, 70);
    NormalBtn.resize(100, 30);
    MixedBtn.setText("Mixed Dialog");
    MixedBtn.move(20, 120);
    MixedBtn.resize(100, 30);
    connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_Clicked()));
    connect(&NormalBtn, SIGNAL(clicked()), this, SLOT(NormalBtn_Clicked()));
    connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_Clicked()));
    resize(140, 170);
}
void Dialog::ModalBtn_Clicked()
{
    qDebug() << "ModalBtn_Clicked() Begin";
    QDialog dialog(this);
    dialog.exec();
    // done(Accepted);
    qDebug() << "ModalBtn_Clicked() End";
}
void Dialog::NormalBtn_Clicked()
{
    qDebug() << "NormalBtn_Clicked() Begin";
    QDialog* dialog = new QDialog(this);//如定義為棧  QDialog dialog ;  dialog->show();會一閃而過  也就是說對話框顯示至桌面時,依然會繼續往下運行,運行到函數的末尾(這個是消息映射函數)局部變量就被銷毀了,所以對話框就消失了  如果是在堆上,銷毀的只是指向這個堆對象的指針,堆對象不會被銷毀,對話框就不糊消失了 
    dialog->setAttribute(Qt::WA_DeleteOnClose);//設置該屬性即可在讓在該窗口關閉時就可以釋放堆上的內存了不會造成泄漏
    dialog->show();
    // done(Rejected);
    qDebug() << "NormalBtn_Clicked() End";
}
void Dialog::MixedBtn_Clicked()//混合的對話框
{
    qDebug() << "MixedBtn_Clicked() Begin";
    QDialog* dialog = new QDialog(this);//指定父組件this
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->setModal(true);//設置非模態對話框的行為類似模態對話框   為混合對話框
    dialog->show();
    // done(100);
    qDebug() << "MixedBtn_Clicked() End";
}
Dialog::~Dialog()
{
    qDebug() << "~Dialog()";
}

 

對話框的返回值:

只有模態對話框才具有返回值(因為模態對話框用於選擇的)

模態對話框返回值用於表示交互結果

實際應用中就是根據用戶的操作exec得到不同的結果值,根據這些值判斷做出相應的操作(進入不同的處理函數)

 當刪除一個dialog對象時,exec()返回QDialog::Rejected,因此在刪除dialog時要特別小心。

#include <QtGui/QApplication>
#include <QWidget>
#include <QDialog>
#include <QDebug>
#include "Dialog.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog dlg;
    int r = dlg.exec();//將Dialog 設置為模態對話框,程序運行到這一行就會阻塞了
    if( r == QDialog::Accepted )
    {
        qDebug() << "Accepted";
    }
    else if( r == QDialog::Rejected )
    {
        qDebug() << "Rejected";
    }
    else
    {
        qDebug() << r;
    }
    
    return r;// 如果將一個對話框一模態對話框的模式運行返回值需要時r;;

 //如果直接返回a.exec()就進入了兩次消息循環,其實就是進入消息循環 當關閉窗口的時候應用程序不會結束了  所以返回值需要時r;
}

.c

 

#include "Dialog.h"
#include <QDebug>
Dialog::Dialog(QWidget *parent) :
        QDialog(parent), ModalBtn(this), NormalBtn(this), MixedBtn(this)
{
    ModalBtn.setText("Modal Dialog");
    ModalBtn.move(20, 20);
    ModalBtn.resize(100, 30);
    NormalBtn.setText("Normal Dialog");
    NormalBtn.move(20, 70);
    NormalBtn.resize(100, 30);
    MixedBtn.setText("Mixed Dialog");
    MixedBtn.move(20, 120);
    MixedBtn.resize(100, 30);
    connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_Clicked()));
    connect(&NormalBtn, SIGNAL(clicked()), this, SLOT(NormalBtn_Clicked()));
    connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_Clicked()));
    resize(140, 170);
}
void Dialog::ModalBtn_Clicked()
{
    qDebug() << "ModalBtn_Clicked() Begin";
   
     done(Accepted);
    qDebug() << "ModalBtn_Clicked() End";
}
void Dialog::NormalBtn_Clicked()
{
    qDebug() << "NormalBtn_Clicked() Begin";

  
     done(Rejected);
    qDebug() << "NormalBtn_Clicked() End";
}
void Dialog::MixedBtn_Clicked()
{
    qDebug() << "MixedBtn_Clicked() Begin";
   done(100);
    qDebug() << "MixedBtn_Clicked() End";
}
Dialog::~Dialog()
{
    qDebug() << "~Dialog()";
}

其中void QDialog::​done(int r)函數一直不理解 也沒有找到說清楚的博客

最可靠的還是到幫助文檔:

 void QDialog::​done(int r)//設置返回值關閉對話框

 Closes the dialog and sets its result code to r. If this dialog is shown with exec(), done() causes the local event loop to finish, and exec() to return r.

隱藏模式對話框並且設置結果代碼為r

 

狄泰學院第17課 - 對話框及其類型筆記

http://blog.csdn.net/xgy_123/article/details/22219639

http://www.kuqin.com/qtdocument/qdialog.html


免責聲明!

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



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