對話框在Qt GUI應用程序中有着廣泛的用途,對話框有模態、非模態兩種情況。
對於參數選擇的對話框,一般用模態對話框;對於顯示或查看某些內容的對話框,一般用非模態對話框。
對話框類QDialog,官方文檔:http://qt-project.org/doc/qt-4.8/qdialog.html
1. 模態對話框
模態對話框通過調用exec()函數實現,使用模態對話框時,事件就在對話框內部循環,必須將對話框關閉才能繼續執行主界面的操作。
需要注意的是,關閉模態對話框時,exec()將返回一個值。
原型:int QDialog::exec () [slot]
返回值利用:比如對話框中有Ok和Cancel兩個按鈕,點擊Ok按鈕時,關閉對話框同時主程序接受對話框中設置的參數,點擊Cancel或右上角的X后,關閉對話框並且立即返回不再執行下面的程序。這種情況下,將Ok按鈕的clicked()信號與accept()槽連接,Cancel按鈕的clicked信號與reject()槽連接。這時,當點擊Ok按鈕式,將觸發accept()槽,exec()返回QDialog::Recepted,當點擊Cancel按鈕時,將觸發reject槽,exec()返回QDialog::Rejected。
connect(ui.Ok,SIGNAL(clicked()),this,SLOT(accept()));
connect(ui.Cancel,SIGNAL(clicked()),this,SLOT(reject()));
執行時,進行一下判斷,點擊了Cancel返回,點擊了Ok傳遞對話框中的參數繼續執行
1 //在某個函數中調用對話框 2 // a為對話框類對象 3 if(a.exec() == QDialog::Rejected) 4 { 5 //操作 6 return; 7 } 8 //傳遞對話框中的參數 9 //繼續操作
不知道說明白了沒有,不明白的話自己下代碼實現一下。
2. 非模態對話框
非模態對話框調用show()函數實現,當然在主程序中,調用非模態對話框時,如果只寫個show(),可能是對話框一閃而過,為了解決這個情況,需要全局對象的事件響應槽processEvents(),定時的訪問該對話框,這樣就可以處理主界面的事件同時對話框也不會消失。
本人采用方法時利用QTimer類的singleShot()方法。QTimer類提供了對時鍾的操作。
QTimer類的官方文檔:http://qt-project.org/doc/qt-4.8/qtimer.html
singleShot的原型:void QTimer::singleShot ( int msec, QObject * receiver, const char * member ) [static]
第一個參數為執行的時間間隔,單位為ms
第二個參數為接受的對象
第三個參數為觸發的槽
恰好,我們可以每隔msec時間觸發processEvents(),從而使對話框不消失,第二個參數為對話框對象。需要注意的是,對話框的對象要定義在堆上(即要定義成指針對象),因為如果定義在棧上,執行完后函數后對象會被自動清理掉,找不到第二個參數所需的對象,就沒法顯示出對話框了。
#include <QTimer>
CModallessDialog *dialog; //最好定義成全局變量 dialog = new CModallessDialog; dialog->show(); dialog->setTitle(tr("非模態對話框")); //設置窗口標題 //對話框中的一些處理 QTimer::singleShot(200,dialog,SLOT(qApp->processEvents())); //時間間隔200ms
在使用時,將dialog對象delete掉之后對話框就會消失
//如果對話框顯示,就將其刪除 if(NULL!=dialog) { delete dialog dialog=NULL; }
在顯示對話框時,也要注意如果dialog!=NULLs時,現將其delete掉賦NULL再分配地址。