詳解 Qt 模態(tài)對(duì)話框和非模態(tài)對(duì)話框
Qt 模態(tài)對(duì)話框和非模態(tài)對(duì)話框 是本文介紹的內(nèi)容,本文認(rèn)為本篇是一篇很有意思的文章,不多說,我們先來看內(nèi)容。
模態(tài)對(duì)話框就是指在子對(duì)話框彈出時(shí),焦點(diǎn)被強(qiáng)行集中于該子對(duì)話框,子對(duì)話框不關(guān)閉,用戶將無(wú)法操作其他的窗口。非模態(tài)相反,用戶仍然可以操作其他的窗口,包括該子對(duì)話框的父對(duì)話框。
如果從線程角度來講,模態(tài)對(duì)話框?qū)嶋H上是線程阻塞的,也就是子對(duì)話框是一個(gè)線程,但是在創(chuàng)建這個(gè)子線程之后,父窗口就阻塞了;模態(tài)對(duì)話框則不是阻塞型的線程模型,父子線程可以并行運(yùn)行。
和所有流行的圖形類庫(kù)一樣,Qt也提供了創(chuàng)建模態(tài)和非模態(tài)對(duì)話框的機(jī)制。
在Qt中創(chuàng)建模態(tài)對(duì)話框,主要用到了QDialog的exec函數(shù):
- 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函數(shù)的返回值來判斷用戶點(diǎn)擊了哪個(gè)按鈕使得模態(tài)對(duì)話框退出的,這可以使得我們能夠根據(jù)用戶的不同行為在推出退出模態(tài)對(duì)話框之后采取不同的處理方法。
在Qt中創(chuàng)建非模態(tài)對(duì)話框,主要用到了QDialog的show函數(shù):
- SonDialog *dlg;
- dlg = new SonDialog(this);
- dlg->show();
由上面代碼,細(xì)心的讀者可能就會(huì)問了,既然new了,如果不delete,那么內(nèi)存不就存在了泄露的問題了嗎?確實(shí)如此!所以,我們希望該Qt窗口在退出時(shí)自動(dòng)能夠delete掉自己,因此,我們?cè)赟onDialog的構(gòu)造函數(shù)里,添加這樣的一句代碼:
- setAttribute (Qt::WA_DeleteOnClose);
這樣,我們的SonDialog就能夠在它退出時(shí)自動(dòng)的delete掉自己了,不會(huì)再造成內(nèi)存泄漏問題。
小結(jié):關(guān)于 Qt 模態(tài)對(duì)話框和非模態(tài)對(duì)話框 的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!