模式對話框
描述
阻塞同一應用程序中其它可視窗口輸入的對話框。模式對話框有自己的事件循環,用戶必須完成這個對話框中的交互操作,並且關閉了它之后才能訪問應用程序中的其它任何窗口。模式對話框僅阻止訪問與對話相關聯的窗口,允許用戶繼續使用其它窗口中的應用程序。
顯示模態對話框最常見的方法是調用其exec()函數,當用戶關閉對話框,exec()將提供一個有用的返回值,並且這時流程控制繼續從調用exec()的地方進行。通常情況下,要獲得對話框關閉並返回相應的值,我們連接默認按鈕,例如:”確定”按鈕連接到accept()槽,”取消”按鈕連接到reject()槽。另外我們也可以連接done()槽,傳遞給它Accepted或Rejected。
效果
退出
我們可以通過調用accept()或者是reject()函數來是使得exec()函數結束代碼如下:
//可以在之前的代碼的快要結束的額時候調用accept();然后在主函數中 login *user_login=new login;//login是繼承dialog的類 int res = user_login->exec(); if (res == QDialog::Accepted) { delete user_login; }
源碼
MainWindow *pMainWindow = new MainWindow(); pMainWindow->setWindowTitle(QStringLiteral("主界面")); pMainWindow->show(); CustomWindow *pDialog = new CustomWindow(pMainWindow); pDialog->setWindowTitle(QStringLiteral("模式對話框")); // 關鍵代碼 pDialog->exec(); // 關閉模態對話框以后才會執行下面的代碼 pMainWindow->setWindowTitle(QStringLiteral("主界面-模式對話框")); qDebug() << QStringLiteral("關閉模態對話框以后,可以繼續向下執行");
- 主界面被阻塞,不能進行點擊、拖動等任何操作。
- exec()之后的代碼不會執行,直到關閉模態對話框。
非模式對話框
描述
和同一個程序中其它窗口操作無關的對話框。在文字處理中的查找和替換對話框通常是非模式的,允許用戶同時與應用程序的主窗口和對話框進行交互。調用show()來顯示非模式對話框,並立即將控制返回給調用者。
如果隱藏對話框后調用show()函數,對話框將顯示在其原始位置,這是因為窗口管理器決定的窗戶位置沒有明確由程序員指定,為了保持被用戶移動的對話框位置,在closeEvent()中進行處理,然后在顯示之前,將對話框移動到該位置。
效果
源碼
MainWindow *pMainWindow = new MainWindow(); pMainWindow->setWindowTitle(QStringLiteral("主界面")); pMainWindow->show(); CustomWindow *pDialog = new CustomWindow(pMainWindow); pDialog->setWindowTitle(QStringLiteral("非模式對話框")); // 關鍵代碼 pDialog->show(); // 下面的代碼會立即運行 pMainWindow->setWindowTitle(QStringLiteral("主界面-非模式對話框")); qDebug() << QStringLiteral("立即運行");
- 主界面不會被阻塞,可以進行點擊、拖動等任何操作。
- show()之后的代碼會立即執行。
半模式對話框
描述
調用setModal(true)或者setWindowModality(),然后show()。有別於exec(),show() 立即返回給控制調用者。
對於進度對話框來說,調用setModal(true)是非常有用的,用戶必須擁有與其交互的能力,例如:取消長時間運行的操作。如果使用show()和setModal(true)共同執行一個長時間操作,則必須定期在執行過程中調用QApplication ::processEvents(),以使用戶能夠與對話框交互(可以參考QProgressDialog)。
效果
源碼
MainWindow *pMainWindow = new MainWindow(); pMainWindow->setWindowTitle(QStringLiteral("主界面")); pMainWindow->show(); CustomWindow *pDialog = new CustomWindow(pMainWindow); pDialog->setWindowTitle(QStringLiteral("半模式對話框")); // 關鍵代碼 pDialog->setModal(true); pDialog->show(); // 下面的代碼會立即運行 pMainWindow->setWindowTitle(QStringLiteral("主界面-半模式對話框")); qDebug() << QStringLiteral("立即運行");
- 主界面被阻塞,不能進行點擊、拖動等任何操作。
- show()之后的代碼會立即執行。
原文:https://blog.csdn.net/liang19890820/article/details/51067310