Qt: 如何处理用户按下“ X”(关闭)按钮的事件?

在 Qt 中,与用户单击窗口框架的“ X”(关闭)按钮相对应的槽是什么,即这个按钮:

Close button of the window

如果没有插槽,用户按下关闭按钮后是否有其他方法触发函数?

145865 次浏览

我知道了。一种方法是重写类定义中的 QWidget::closeEvent(QCloseEvent *event)方法,并将代码添加到该函数中。例如:

class foo : public QMainWindow
{
Q_OBJECT
private:
void closeEvent(QCloseEvent *bar);
// ...
};




void foo::closeEvent(QCloseEvent *bar)
{
// Do something
bar->accept();
}

如果有 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();
}
}


如果你子类化一个 QDialogcloseEvent将不会被调用,所以你必须覆盖 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();
}
}

可以将槽附加到

void aboutToQuit();

这个信号应该在应用程序关闭之前发出。

也可以重新实现受保护的成员 QWidget: : closeEvent ()

void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
// do what you need here
// then call parent's procedure
QWidget::closeEvent(event);
}