2012-04-29 21 views
13

He botón X discapacitados en Qt de mi diálogo utilizando esta línea:¿Cómo puedo desactivar el cierre de ventana Alt + F4 usando Qt?

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

pero no pude detectar Alt + F4 utilizando este código:

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

lo debo hacer para detectar Alt + F4 o desactivarlo en Qt?

Respuesta

24

Al presionar Alt+F4, se produce un evento de cierre que se envía a la ventana de nivel superior. En su clase de ventana, puede anular closeEvent() para ignorarla y evitar que se cierre su aplicación.

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

Si dejó el botón de cerrar (X) visible, este método también lo desactivaría para que no se cierre su aplicación.

Esto generalmente se utiliza para dar a la aplicación la oportunidad de decidir si quiere cerrarla o preguntar al usuario mostrando un "¿Está seguro?" buzon de mensaje.

0

También se puede controlar el evento en la clase de su cuadro de diálogo (al menos si se trata de DLG modal):

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

El código de abajo impide un cierre de diálogo cuando se pulsa Alt + F4, [X], o escapar, pero no llamando al método 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 
} 

buena suerte para todos nosotros;)

+0

Tienes dos errores: es 'keyPressEvent (QKeyEvent * EVT)' '' no Press' Pressed' y el tipo es diferente. Pero con esta corrección aplicada ... funciona bien. :) –

+0

Ignorar keyPressEvent (QKeyEvent * evt) y dejarlo vacío, podría causar otros problemas, como no funcionar Introducir el comportamiento de la clave que podría ser necesario, por ejemplo, cuando queremos permitir que el usuario continúe haciendo clic en la tecla Enter. Por lo tanto, es mucho mejor definir claves que no queremos permitir explícitamente en tales casos específicos. O, en otras palabras, sería recomendable llamar a BaseWidget :: keyPressEvent (evt) donde BaseWidget es algo que se hereda (podría ser QWidget, QDialog, etc.) –

Cuestiones relacionadas