Qt: как мне обрабатывать событие нажатия пользователем кнопки " X " (закрыть)?
Я разрабатываю приложение с использованием Qt. Я не знаю, какой слот соответствует событию "пользователь нажимает кнопку" X "(закрыть) оконной рамы", т. е. эту кнопку:
Если для этого нет слота, может ли кто-нибудь предложить мне какой-нибудь другой метод, с помощью которого я могу запустить функцию после того, как пользователь нажмет эту кнопку закрытия.
4 ответов
если у вас QMainWindow
можно переопределить closeEvent
метод.
#include <QCloseEvent>
void MainWindow::closeEvent (QCloseEvent *event)
{
QMessageBox::StandardButton resBtn = QMessageBox::question( this, APP_NAME,
tr("Are you sure?\n"),
QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
QMessageBox::Yes);
if (resBtn != QMessageBox::Yes) {
event->ignore();
} else {
event->accept();
}
}
если вы подкласс QDialog
, the closeEvent
не будет вызываться, и поэтому вы должны переопределить reject()
:
void MyDialog::reject()
{
QMessageBox::StandardButton resBtn = QMessageBox::Yes;
if (changes) {
resBtn = QMessageBox::question( this, APP_NAME,
tr("Are you sure?\n"),
QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
QMessageBox::Yes);
}
if (resBtn == QMessageBox::Yes) {
QDialog::reject();
}
}
Ну, я понял. Один из способов-переопределить QWidget::closeEvent
(QCloseEvent *event)
метод в определении класса и добавьте свой код в эту функцию. Пример:
class foo : public QMainWindow
{
Q_OBJECT
private:
void closeEvent(QCloseEvent *bar);
// ...
};
void foo::closeEvent(QCloseEvent *bar)
{
// Do something
bar->accept();
}
вы можете прикрепить слот к
void aboutToQuit();
сигнал вашего QApplication. Этот сигнал должен быть поднят непосредственно перед закрытием приложения.
также вы можете переопределить защищенный член QWidget:: closeEvent()
void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
// do what you need here
// then call parent's procedure
QWidget::closeEvent(event);
}