我正在使用Qt开发一个应用程序.我不知道哪个插槽对应于"用户点击窗口框架的'X'(关闭)按钮"事件"即此按钮:

如果没有这方面的插槽,任何人都可以建议我一些其他的方法,我可以在用户按下关闭按钮后启动一个功能.
asc*_*pix 148
如果你有一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果你是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();
}
}
Run Code Online (Sandbox Code Playgroud)
The*_*der 15
好吧,我明白了.一种方法是覆盖类定义中的方法,并将代码添加到该函数中.例:QWidget::closeEvent(QCloseEvent *event)
class foo : public QMainWindow
{
Q_OBJECT
private:
void closeEvent(QCloseEvent *bar);
// ...
};
void foo::closeEvent(QCloseEvent *bar)
{
// Do something
bar->accept();
}
Run Code Online (Sandbox Code Playgroud)
Seb*_*nge 12
您可以将SLOT附加到
void aboutToQuit();
Run Code Online (Sandbox Code Playgroud)
你的QApplication的信号.应在app关闭之前提出此信号.
小智 7
你也可以重新实现受保护的成员QWidget :: closeEvent()
void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
// do what you need here
// then call parent's procedure
QWidget::closeEvent(event);
}
Run Code Online (Sandbox Code Playgroud)