Qt 之模式、非模式、半模式對話方塊
相關文章
簡述
關於“模式”和“非模式”對話方塊,相信大家都比較熟悉,但其中有一個可能很多人都比較陌生,介於兩者之間的狀態,我們稱之為“半模式“。
|
模式對話方塊
描述
阻塞同一應用程式中其它可視視窗輸入的對話方塊。模式對話方塊有自己的事件迴圈,使用者必須完成這個對話方塊中的互動操作,並且關閉了它之後才能訪問應用程式中的其它任何視窗。模式對話方塊僅阻止訪問與對話相關聯的視窗,允許使用者繼續使用其它視窗中的應用程式。
顯示模態對話方塊最常見的方法是呼叫其exec()函式,當用戶關閉對話方塊,exec()將提供一個有用的返回值,並且這時流程控制繼續從呼叫exec()的地方進行。通常情況下,要獲得對話方塊關閉並返回相應的值,我們連線預設按鈕,例如:”確定”按鈕連線到accept()槽,”取消”按鈕連線到reject()槽。另外我們也可以連線done()槽,傳遞給它Accepted或Rejected。
效果
原始碼
MainWindow *pMainWindow = new MainWindow();
pMainWindow->setWindowTitle(QStringLiteral("主介面"));
pMainWindow->show();
CustomWindow *pDialog = new CustomWindow(pMainWindow);
pDialog->setWindowTitle(QStringLiteral("模式對話方塊"));
// 關鍵程式碼
pDialog->exec();
// 關閉模態對話方塊以後才會執行下面的程式碼
pMainWindow-> setWindowTitle(QStringLiteral("主介面-模式對話方塊"));
qDebug() << QStringLiteral("關閉模態對話方塊以後,可以繼續向下執行");
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 主介面被阻塞,不能進行點選、拖動等任何操作。
- 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("立即執行");
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 主介面不會被阻塞,可以進行點選、拖動等任何操作。
- 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("立即執行");
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 主介面被阻塞,不能進行點選、拖動等任何操作。
- show()之後的程式碼會立即執行。