Qt: Как мне обработать событие, когда пользователь нажимает кнопку «X» (закрыть)?
126
Я разрабатываю приложение с использованием Qt. Я не знаю, какой слот соответствует событию «пользователь нажимает кнопку« X »(закрыть) в рамке окна», то есть этой кнопке:
Если для этого нет слота, может ли кто-нибудь предложить мне другой метод, с помощью которого я могу запустить функцию после того, как пользователь нажмет кнопку закрытия.
Если мое приложение создано путем создания подкласса от QApplication, как я могу добиться того же, что указано выше?
пракашпун 07
@ pra16 connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));должен работать. См. Ответ Себастьяна ниже.
Шива
1
Вы можете также использовать setAttribute(Qt::WA_QuitOnClose);для MainWindow.
Borzh
Вы уверены, что наследование QDialog не вызовет closeEvent? У меня это работает, и в документации QCloseEvent сказано, что обработчик событий QWidget :: closeEvent () получает события закрытия, а QDialog также является виджетом, верно? Или это как-то связано со старой версией Qt (<5.x)?
Dimitri Podborki
1
@incBrain Даже в Qt 4.8 кнопка 'X' вызывает closeEventQDialog, но если пользователь нажимает Esc на клавиатуре, QDialog закрывается без вызова closeEvent.
asclepix
16
Хорошо, я понял. Один из способов - переопределить метод в определении вашего класса и добавить код в эту функцию. Пример:QWidget::closeEvent(QCloseEvent *event)
class foo :publicQMainWindow{
Q_OBJECT
private:void closeEvent(QCloseEvent*bar);// ...};void foo::closeEvent(QCloseEvent*bar){// Do something
bar->accept();}
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
должен работать. См. Ответ Себастьяна ниже.setAttribute(Qt::WA_QuitOnClose);
для MainWindow.closeEvent
? У меня это работает, и в документации QCloseEvent сказано, что обработчик событий QWidget :: closeEvent () получает события закрытия, а QDialog также является виджетом, верно? Или это как-то связано со старой версией Qt (<5.x)?closeEvent
QDialog, но если пользователь нажимает Esc на клавиатуре, QDialog закрывается без вызоваcloseEvent
.Хорошо, я понял. Один из способов - переопределить метод в определении вашего класса и добавить код в эту функцию. Пример:
QWidget::closeEvent
(QCloseEvent *event)
источник
Вы можете прикрепить СЛОТ к
сигнал вашего QApplication. Этот сигнал должен быть подан непосредственно перед закрытием приложения.
источник
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
также вы можете повторно реализовать защищенный член QWidget :: closeEvent ()
источник