Answers:
如果您有一个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();
}
}
如果要对a进行子类化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();
}
}
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
应该工作。请参阅下面的塞巴斯蒂安答案。
setAttribute(Qt::WA_QuitOnClose);
用于MainWindow。
closeEvent
吗?它对我有用,并且QCloseEvent的文档说事件处理程序QWidget :: closeEvent()接收关闭事件,而QDialog也是一个Widget,对吗?还是与旧版Qt(<5.x)相关?
closeEvent
也会调用QDialog,但是如果用户按键盘上的Esc键,则QDialog将关闭而不进行调用closeEvent
。
好吧,我明白了。一种方法是覆盖类定义中的方法,然后将代码添加到该函数中。例: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的信号。该信号应在应用程序关闭之前发出。
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));