143

我正在使用 Qt 开发应用程序。我不知道哪个槽对应于“用户单击窗口框架的'X'(关闭)按钮”的事件,即这个按钮:

窗口的关闭按钮

如果没有这个插槽,任何人都可以建议我一些其他方法,在用户按下该关闭按钮后我可以启动一个功能。

4

4 回答 4

190

如果你有一个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();
    }
}
于 2013-07-05T06:53:05.837 回答
19

嗯,我明白了。一种方法是覆盖类定义中的方法并将代码添加到该函数中。例子:QWidget::closeEvent(QCloseEvent *event)

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


void foo::closeEvent(QCloseEvent *bar)
{
    // Do something
    bar->accept();
}
于 2013-07-05T04:46:40.017 回答
12

您可以将 SLOT 附加到

void aboutToQuit();

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

于 2013-07-05T10:44:05.773 回答
11

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

void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
    // do what you need here
    // then call parent's procedure
    QWidget::closeEvent(event);
}
于 2015-11-27T09:44:41.890 回答