如果您有 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
子类化,则不会调用 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();
}
您可以将 SLOT 附加到
void aboutToQuit();
QApplication 的信号。这个信号应该在应用程序关闭之前发出。
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
你也可以重新实现受保护的成员 QWidget::closeEvent()
void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
// do what you need here
// then call parent's procedure
QWidget::closeEvent(event);
}
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
应该可以工作。请参阅下面塞巴斯蒂安的回答。setAttribute(Qt::WA_QuitOnClose);
用于 MainWindow。closeEvent
吗?它对我有用,QCloseEvent 的文档说 事件处理程序 QWidget::closeEvent() 接收关闭事件 并且 QDialog 也是一个小部件,对吗?或者它是否与旧的 Qt 版本(<5.x)有关?closeEvent
,但如果用户按下键盘上的 Esc,QDialog 会在不调用closeEvent
的情况下关闭。