Qt之模式、非模式、半模式对话框
關(guān)于“模式”和“非模式”對(duì)話框,相信大家都比較熟悉,但其中有一個(gè)可能很多人都比較陌生,介于兩者之間的狀態(tài),我們稱之為“半模式“。
模式對(duì)話框
描述
阻塞同一應(yīng)用程序中其它可視窗口輸入的對(duì)話框。模式對(duì)話框有自己的事件循環(huán),用戶必須完成這個(gè)對(duì)話框中的交互操作,并且關(guān)閉了它之后才能訪問(wèn)應(yīng)用程序中的其它任何窗口。模式對(duì)話框僅阻止訪問(wèn)與對(duì)話相關(guān)聯(lián)的窗口,允許用戶繼續(xù)使用其它窗口中的應(yīng)用程序。
顯示模態(tài)對(duì)話框最常見的方法是調(diào)用其exec()函數(shù),當(dāng)用戶關(guān)閉對(duì)話框,exec()將提供一個(gè)有用的返回值,并且這時(shí)流程控制繼續(xù)從調(diào)用exec()的地方進(jìn)行。通常情況下,要獲得對(duì)話框關(guān)閉并返回相應(yīng)的值,我們連接默認(rèn)按鈕,例如:”確定”按鈕連接到accept()槽,”取消”按鈕連接到reject()槽。另外我們也可以連接done()槽,傳遞給它Accepted或Rejected。
效果
源碼
MainWindow *pMainWindow = new MainWindow(); pMainWindow->setWindowTitle(QStringLiteral("主界面")); pMainWindow->show();CustomWindow *pDialog = new CustomWindow(pMainWindow); pDialog->setWindowTitle(QStringLiteral("模式對(duì)話框"));// 關(guān)鍵代碼 pDialog->exec();// 關(guān)閉模態(tài)對(duì)話框以后才會(huì)執(zhí)行下面的代碼 pMainWindow->setWindowTitle(QStringLiteral("主界面-模式對(duì)話框")); qDebug() << QStringLiteral("關(guān)閉模態(tài)對(duì)話框以后,可以繼續(xù)向下執(zhí)行")非模式對(duì)話框
描述
和同一個(gè)程序中其它窗口操作無(wú)關(guān)的對(duì)話框。在文字處理中的查找和替換對(duì)話框通常是非模式的,允許用戶同時(shí)與應(yīng)用程序的主窗口和對(duì)話框進(jìn)行交互。調(diào)用show()來(lái)顯示非模式對(duì)話框,并立即將控制返回給調(diào)用者。
如果隱藏對(duì)話框后調(diào)用show()函數(shù),對(duì)話框?qū)@示在其原始位置,這是因?yàn)榇翱诠芾砥鳑Q定的窗戶位置沒(méi)有明確由程序員指定,為了保持被用戶移動(dòng)的對(duì)話框位置,在closeEvent()中進(jìn)行處理,然后在顯示之前,將對(duì)話框移動(dòng)到該位置。
效果
源碼
MainWindow *pMainWindow = new MainWindow(); pMainWindow->setWindowTitle(QStringLiteral("主界面")); pMainWindow->show();CustomWindow *pDialog = new CustomWindow(pMainWindow); pDialog->setWindowTitle(QStringLiteral("非模式對(duì)話框"));// 關(guān)鍵代碼 pDialog->show();// 下面的代碼會(huì)立即運(yùn)行 pMainWindow->setWindowTitle(QStringLiteral("主界面-非模式對(duì)話框")); qDebug() << QStringLiteral("立即運(yùn)行")半模式對(duì)話框
描述
調(diào)用setModal(true)或者setWindowModality(),然后show()。有別于exec(),show() 立即返回給控制調(diào)用者。
對(duì)于進(jìn)度對(duì)話框來(lái)說(shuō),調(diào)用setModal(true)是非常有用的,用戶必須擁有與其交互的能力,例如:取消長(zhǎng)時(shí)間運(yùn)行的操作。如果使用show()和setModal(true)共同執(zhí)行一個(gè)長(zhǎng)時(shí)間操作,則必須定期在執(zhí)行過(guò)程中調(diào)用QApplication ::processEvents(),以使用戶能夠與對(duì)話框交互(可以參考QProgressDialog)。
效果
源碼
MainWindow *pMainWindow = new MainWindow(); pMainWindow->setWindowTitle(QStringLiteral("主界面")); pMainWindow->show();CustomWindow *pDialog = new CustomWindow(pMainWindow); pDialog->setWindowTitle(QStringLiteral("半模式對(duì)話框"));// 關(guān)鍵代碼 pDialog->setModal(true); pDialog->show();// 下面的代碼會(huì)立即運(yùn)行 pMainWindow->setWindowTitle(QStringLiteral("主界面-半模式對(duì)話框")); qDebug() << QStringLiteral("立即運(yùn)行")總結(jié)
以上是生活随笔為你收集整理的Qt之模式、非模式、半模式对话框的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 显示二维数组并计算和
- 下一篇: 排球计分程序(三)—— 模型类的设计与实