Как я могу отключить закрытие окна Alt + F4 с помощью Qt?

Я отключил кнопку X в Qt в своем диалоговом окне, используя эту строку:

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

но я не смог обнаружить Alt + F4, используя этот код:

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

что мне делать, чтобы обнаружить Alt+F4 или отключить его в Qt?


person Mohammad Sheykholeslam    schedule 29.04.2012    source источник


Ответы (3)


Нажатие Alt+F4 приводит к отправке события закрытия в окно верхнего уровня. В своем классе окна вы можете переопределить closeEvent(), чтобы игнорировать его и предотвратить закрытие приложения.

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

Если вы оставили кнопку закрытия (X) видимой, этот метод также отключит ее от закрытия вашего приложения.

Обычно это используется, чтобы дать приложению возможность решить, хочет ли оно закрыться или нет, или спросить пользователя, отображая «Вы уверены?» окно сообщения.

person Arnold Spence    schedule 29.04.2012

Приведенный ниже код предотвращает закрытие диалогового окна при нажатии клавиш Alt+F4, [X] или Escape, но не путем вызова метода 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
}   

удачи всем нам ;)

person Alexander Chernin    schedule 25.03.2015
comment
У вас две ошибки: это keyPressEvent(QKeyEvent *evt) Press не Pressed и тип другой. Но с этим исправлением... оно работает хорошо. :) - person V.K.; 12.01.2017
comment
Простое переопределение keyPressEvent(QKeyEvent *evt) и оставление его пустым может вызвать другие проблемы, такие как неработающее поведение клавиши Enter, которое может потребоваться, например, когда мы хотим разрешить пользователю продолжить, нажав клавишу Enter. Таким образом, гораздо лучше определить ключи, которые мы не хотим явно разрешать в таких конкретных случаях. Или, другими словами, было бы целесообразно вызвать BaseWidget::keyPressEvent(evt), где BaseWidget — это то, что унаследовано (это может быть QWidget, QDialog и т. д.) - person Vaidotas Strazdas; 29.08.2017

Также вы можете обработать событие в своем диалоговом классе (по крайней мере, если это модальный dlg):

void MyDialog::closeEvent(QCloseEvent* e)
{
    if ( condition )
       e->ignore();
    else
       __super::closeEvent(e);
}
person Illia Levandovskyi    schedule 17.10.2013