2012-04-29 17 views
13

mam wyłączoną przycisk X w Qt z mojego okna za pomocą tej linii:Jak mogę wyłączyć zamykanie okna Alt + F4 za pomocą Qt?

myDialog->setWindowFlags(Qt::Dialog | Qt::Desktop) 

ale nie mogłem wykryć Alt + F4 przy użyciu tego kodu:

void myClass::keyPressEvent(QKeyEvent *e) 
{ 
    if ((e->key()==Qt::Key_F4) && (e->modifiers()==Qt::AltModifier)) 
     doSomething(); 
} 

co powinieneś zrobić, aby wykryć Alt F4 lub wyłączyć go w Qt?

Odpowiedz

24

Naciśnięcie klawisza Alt+F4 powoduje zamknięcie zdarzenia wysyłanego do okna najwyższego poziomu. W klasie okna można zastąpić closeEvent(), aby go zignorować i uniemożliwić zamknięcie aplikacji.

void MainWindow::closeEvent(QCloseEvent * event) 
{ 
    event->ignore(); 
} 

Jeśli pozostawisz widoczny przycisk zamykania (X), ta metoda spowoduje również wyłączenie go przed zamknięciem aplikacji.

Jest to zwykle używane, aby aplikacja mogła zdecydować, czy chce zamknąć, czy nie, lub zapytać użytkownika, wyświetlając komunikat "Czy na pewno?" skrzynka pocztowa.

0

Ponadto można obsłużyć zdarzenia w klasie twojego okna dialogowego (przynajmniej jeśli jest modalne DLG):

void MyDialog::closeEvent(QCloseEvent* e) 
{ 
    if (condition) 
     e->ignore(); 
    else 
     __super::closeEvent(e); 
} 
3

Poniższy kod zapobiega bliski dialogowe po naciśnięciu Alt + F4, [X] lub uciec, ale nie przez wywołanie metody SomeDialog :: close().

void SomeDialog::closeEvent(QCloseEvent *evt) { 
    evt->setAccepted(!evt->spontaneous()); 
} 

void SomeDialog::keyPressEvent(QKeyEvent *evt) { 
    // must be overridden but empty if the only you need is to prevent closing by Escape 
} 

szczęście dla nas wszystkich;)

+0

Masz dwa błędy: jest 'keyPressEvent (QKeyEvent * EVT)' '' nie Press' Pressed' a typ jest inny. Ale po zastosowaniu tej poprawki ... działa dobrze. :) –

+0

Just overriding keyPressEvent (QKeyEvent * evt) i pozostawienie go pustego, może spowodować inne problemy, na przykład nie działa Wprowadź kluczowe zachowanie, które może być potrzebne, na przykład, gdy chcemy zezwolić użytkownikowi na kontynuowanie, klikając klawisz Enter. Dlatego znacznie lepiej jest zdefiniować klucze, których nie chcemy jawnie dopuszczać w takich konkretnych przypadkach. Innymi słowy, byłoby wskazane wywołanie BaseWidget :: keyPressEvent (evt), gdzie BaseWidget jest dziedziczone (może to być QWidget, QDialog itp.) –