2015-05-13 14 views
5

Korzystanie z Qt 5.3.0 i Windows 8.1:Jak reagować na „Zamknij okno” w prawym przyciskiem myszy menu paska zadań w systemie Windows

Nie wiem, czy jestem czegoś brakuje lub jeśli jest to niedopatrzenie w Qt, ale kiedy po prostu mam QMainWindow, który otwiera QDialog (z exec()), a następnie spróbuj użyć funkcji "Zamknij okno" menu prawego przycisku ikony paska zadań Windows (podczas gdy okno dialogowe jest nadal otwarte), aplikacja nie zamyka się zgodnie z oczekiwaniami, ale nic się nie dzieje. Również nie dostaję closeEvent w QDialog lub QMainWindow.

Gdy tylko QMainWindow jest otwarty, aplikacja jest zamykana pomyślnie i otrzymuję również closeEvent.

To jest rzeczywiście powtarzalne, gdy np. za pomocą Qt Designer i otwarcie dodatkowego okna dialogowego, a następnie próba użycia funkcji "Zamknij okno".

Jakieś pomysły naprawienia tego zachowania?

Odpowiedz

5

Zachowanie, które widzisz, nie jest naprawdę zaskakujące. Właściwie to właśnie dzieje się z (głównie) dobrze zachowaną aplikacją Windows, taką jak Notatnik, więc nie jestem pewien, czy mógłbym ją nazwać błędem.

Otwórz Notatnik i wybierz Pomoc-> Informacje, aby uzyskać modalne okno dialogowe. Teraz wybierz Zamknij z ikony na pasku zadań. Nic się nie dzieje.

Zamknięcie z paska zadań jest wysyłane do głównego okna, tak jakby użytkownik wybrał opcję Zamknij z menu "system". To przychodzi jako WM_SYSCOMMAND z SC_CLOSE. Jeśli nie będziesz tego obsługiwał jawnie, DefWindowProc zamieni go w komunikat WM_CLOSE, który obsługuje większość głównych okien.

Ale jeśli masz otwarte okno modalne, główne okno jest wyłączone, a tym samym nie dostaje komunikatu.

Jednym ze sposobów naprawienia tego nie byłoby posiadanie modalnych okien dialogowych i zamiast tego symulacja modalności z niemodnymi oknami dialogowymi. Umożliwiłoby to wyświetlenie głównego okna i odpowiedź na wiadomość. Ale to będzie dużo pracy za drobną poprawkę.

+2

Jest to trochę niefortunne z punktu widzenia użyteczności, ale ma sens biorąc pod uwagę twoje wyjaśnienia i przynajmniej mogę wskazać palcem na aplikacje natywne zachowujące się tak samo, na wypadek gdyby ktoś narzekał :) – Robert

+0

Uzgodnione. Jeszcze jeden powód, aby unikać modalnych dialogów w jak największym stopniu. –

2

Jeśli zadzwonić do QDialog poprzez QDialog::show() minięciu MainWindow jako rodzica (QDialog *dialog = new QDialog(this)) gdzie this jest wskaźnik do MainWindow, to będzie działać. Jednak dialog nie będzie już modalny. Nie wiem, czy modalność jest ważna w twoim przypadku.

Powiązane problemy