天天看點

Qt的模态對話框和非模态對話框

來自:http://blog.sina.com.cn/s/blog_4a33cfca0100db3z.html

模态對話框就是指在子對話框彈出時,焦點被強行集中于該子對話框,子對話框不關閉,使用者将無法操作其他的視窗。非模态相反,使用者仍然可以操作其他的視窗,包括該子對話框的父對話框。

如果從線程角度來講,模态對話框實際上是線程阻塞的,也就是子對話框是一個線程,但是在建立這個子線程之後,父視窗就阻塞了;模态對話框則不是阻塞型的線程模型,父子線程可以并行運作。 和所有流行的圖形類庫一樣,Qt也提供了建立模态和非模态對話框的機制。 在Qt中建立模态對話框,主要用到了QDialog的exec函數: SonDialog dlg(this); int res = dlg.exec(); if (res == QDialog::Accepted) {     QMessageBox::information(this, "INFORMATION", "You clicked OK button!"); } if (res == QDialog::Rejected) {     QMessageBox::information(this, "INFORMATION", "You clicked CANCEL button!"); } 正如上面代碼所顯示的,可以通過exec函數的傳回值來判斷使用者點選了哪個按鈕使得模态對話框退出的,這可以使得我們能夠根據使用者的不同行為在推出退出模态對話框之後采取不同的處理方法。 在Qt中建立非模态對話框,主要用到了QDialog的show函數: SonDialog *dlg; dlg = new SonDialog(this); dlg->show(); 由上面代碼,細心的讀者可能就會問了,既然new了,如果不delete,那麼記憶體不就存在了洩露的問題了嗎?确實如此!是以,我們希望該Qt視窗在退出時自動能夠delete掉自己,是以,我們在SonDialog的構造函數裡,添加這樣的一句代碼: setAttribute (Qt::WA_DeleteOnClose); 這樣,我們的SonDialog就能夠在它退出時自動的delete掉自己了,不會再造成記憶體洩漏問題。