2015-05-13 35 views
5

使用Qt 5.3.0和Windows 8.1:如何在任務欄的右鍵菜單「關閉窗口」反應在Windows

不要,如果我失去了一些東西還是知道這是一個疏忽在Qt中,但是當我只有一個打開QDialog(帶有exec())的QMainWindow,然後嘗試使用Windows任務欄圖標的右鍵單擊菜單的「關閉窗口」功能時(同時對話框仍處於打開狀態),應用程序未按預期關閉,但沒有任何反應。我也沒有在QDialog或QMainWindow中獲得closeEvent。

當只有QMainWindow打開時,應用程序已成功關閉,而且我還得到一個closeEvent。

這實際上也是可重現的,例如,使用Qt Designer並打開一個額外的對話框,然後嘗試使用「關閉窗口」功能。

任何想法如何解決這種行爲?

回答

5

你看到的行爲並不令人驚訝。事實上,這正是一個像記事本一樣運行良好的Windows應用程序所發生的事情,所以我不確定我會把它稱爲一個錯誤。

打開記事本,然後選擇幫助 - >關於獲取模式對話框。現在從任務欄圖標中選擇關閉。什麼都沒發生。

從任務欄的關閉被髮送到主窗口,就好像用戶從「系統」菜單中選擇了關閉選項一樣。以SC_CLOSE作爲WM_SYSCOMMAND到達。如果你沒有明確的處理,那麼DefWindowProc將它變成一個WM_CLOSE消息,大多數主窗口都會處理這個消息。

但是,如果您打開了模式對話框,主窗口將被禁用,因此不會收到消息。

解決這個問題的一種方法是不用模態對話框,而是用無模對話框模擬模態。這將允許主窗口接收並回復消息。但是對於一個小的修復來說這將是很多工作。

+2

從可用性的角度來看,這是有點不幸,但給你的解釋是有道理的,至少我可以指向本機應用程序行爲相同,如果有人抱怨:) – Robert

+0

同意。儘可能避免模態對話的另一個原因。 –

2

如果您通過QDialog::show()調用您的QDialog作爲父母的主窗口(QDialog *dialog = new QDialog(this)),其中this是指向您的MainWindow的指針,它將工作。然而,該對話框將不再是模態。我不知道你的情況下情態是否重要。

相關問題