1. 程式人生 > >Qt 之模式、非模式、半模式對話方塊

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
  1. 主介面被阻塞,不能進行點選、拖動等任何操作。
  2. 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
  1. 主介面不會被阻塞,可以進行點選、拖動等任何操作。
  2. 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
  1. 主介面被阻塞,不能進行點選、拖動等任何操作。
  2. show()之後的程式碼會立即執行。

更多參考