How can I disable Alt + F4 window closing using Qt

2019-03-11 05:09发布

问题:

I've disabled X button in Qt from my dialog using this line:

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

but I couldn't detect Alt + F4 using this code:

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

what should I do to detect Alt+F4 or disable it in Qt?

回答1:

Pressing Alt+F4 results in a close event being sent to your top level window. In your window class, you can override closeEvent() to ignore it and prevent your application from closing.

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

If you left the close button (X) visible, this method would also disable it from closing your app.

This is usually used to give the application a chance to decide if it wants to close or not or ask the user by displaying an "Are you sure?" message box.



回答2:

The code below prevents a dialog close when pressed Alt+F4, [X] or Escape, but not by calling SomeDialog::close() method.

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
}   

good luck to all of us ;)



回答3:

Also you can handle the event in your dialog's class (at least if it's modal dlg):

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