1. 程式人生 > >模式對話框,非模式對話框,reject和accept()槽函數確定對話框的返回值

模式對話框,非模式對話框,reject和accept()槽函數確定對話框的返回值

int accept 最好 循環 delet dial let slot bsp

對話框在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再分配地址。

模式對話框,非模式對話框,reject和accept()槽函數確定對話框的返回值