天天看點

QT筆記2__對話框類QDialog(模态和非模态)

QT筆記2__對話框類QDialog_模态和非模态

        • 1.模态對話框
        • 2.非模态對話框
        • 3.半模态對話框
        • 4.視窗模态設定
        • 參考資料

QDialog類是所有對話框視窗類的基類,對話框視窗是常用來完成簡單任務或與使用者完成簡單互動的頂層視窗,QDialog繼承自QWidget。

按照運作目前QDialog時,使用者是否還能與應用程式其他視窗互交,可将對話框視窗分為模态對話框和非模态對話框。視窗的模态、非模态、半模态的顯示方式主要從三個方面進行區分:顯示方式、其他視窗阻塞情況、代碼阻塞情況;

1.模态對話框

1、其他視窗狀态: 當對話框以模态形式顯示時,該應用程式的其他視窗處于未激活狀态,無法接受鍵盤和滑鼠的操作,必須關閉模态對話框才能對其他視窗進行操作。

2、調用方式: 模态對話框一般采用exec()函數進行顯示,當程式調用exec()顯示視窗時候,代碼在exec()處進行阻塞,需要關閉對話框,程式才會繼續運作之後的代碼;

3、代碼阻塞情況: 當關閉模态對話框時,exec()具有傳回值,一般将對話框界面上的"确定"按鈕連接配接槽函數"accept()",“取消"按鈕連接配接"reject()”;或者采用done(int r)函數設定傳回值。

4、舉例: 建立項目對話框;

//建立MainWindow主界面;
QMainWindow *my_MainWin = new QMainWindow();
my_MainWin->setWindowTitle(QString::fromLocal8Bit("我是主界面"));
my_MainWin->show();
//建立QDialog子視窗;
QDialog *my_Dlg = new QDialog(my_MainWin);
my_Dlg->setWindowTitle(QString::fromLocal8Bit("我是模式對話框"));
// 模式對話框顯示
my_Dlg->exec();
// 關閉模态對話框以後才會執行下面的代碼
my_MainWin->setWindowTitle(QString::fromLocal8Bit("主界面-模式對話框"));
           

2.非模态對話框

1、其他視窗狀态 當對話框以非模态對話框顯示時,該應用程式的其他視窗可以正常使用;

2、顯示方式: 非模态對話框一般采用show()函數進行顯示;

3、代碼阻塞情況: 在調用非模态對話框之後,代碼正常運作,不會在對話框顯示處發生阻塞。

4、舉例 word中的查找和替換對話框;

QMainWindow *my_MainWin = new QMainWindow();
 my_MainWin->setWindowTitle(QString::fromLocal8Bit("我是主界面"));
 my_MainWin->show();
 //建立QDialog子視窗;
 QDialog *my_Dlg = new QDialog(my_MainWin);
 my_Dlg->setWindowTitle(QString::fromLocal8Bit("我是非模式對話框"));
 // 模态對話框顯示
 my_Dlg->show();
 // 以下代碼會繼續執行
 my_MainWin->setWindowTitle(QString::fromLocal8Bit("主界面-非模式對話框"));
           

3.半模态對話框

半模态對話框一詞是借用于部落格一去二三裡,由于該形式的對話框,介于模态對話框和非模态對話框之間,是以稱為半模态也算是比較形象。

1、其他視窗狀态: 當對話框以半模态形式顯示時,該應用程式的其他視窗處于未激活狀态,無法接受鍵盤和滑鼠的操作,必須關閉該對話框才能對其他視窗進行操作。

2、顯示方式: 調用setModal(true)或者setWindowModality(),然後show()。

3、代碼阻塞情況: 在調用非模态對話框之後,代碼正常運作,不會在對話框顯示處發生阻塞。

4、舉例: 進度條對話框;

//建立MainWindow主界面;
QMainWindow *my_MainWin = new QMainWindow();
my_MainWin->setWindowTitle(QString::fromLocal8Bit("我是主界面"));
my_MainWin->show();
//建立QDialog子視窗;
QDialog *my_Dlg = new QDialog(my_MainWin);
my_Dlg->setWindowTitle(QString::fromLocal8Bit("我是半模式對話框"));
// 非模态對話框顯示
my_Dlg->setModal(true);
my_Dlg->show();
// 以下代碼會繼續執行
my_MainWin->setWindowTitle(QString::fromLocal8Bit("主界面-半模式對話框"));
           

4.視窗模态設定

  • setModal()函數:

    void setModal(bool modal);

    當modal為true時為模态視窗,false時為非模态視窗;

  • setWindowModality()函數:
    void setWindowModality(Qt::WindowModality windowModality);
    • Qt::NonModal:不阻塞任何視窗,非模态。
    • Qt::WindowModal:阻塞父視窗、所有祖先視窗以及子視窗。
    • Qt::ApplicationModal:阻塞整個應用程式所有視窗。

      setModal()函數的預設設定是,Qt::ApplicationModal。

  • 擷取視窗模态性;
    • Qt::WindowModality windowModality() const; // 傳回視窗的模态性
    • bool isModel() const; // 當視窗為模态視窗是傳回true,否則為false

參考資料

1、《Qt creater 快速入門》