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

时间:2013-07-05 04:16:15

标签: c++ qt

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

Close button of the window

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

4 个答案:

答案 0 :(得分:139)

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

答案 1 :(得分: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();
}

答案 2 :(得分:12)

您可以将SLOT附加到

void aboutToQuit();

您的QApplication的信号。应该在app关闭之前提出此信号。

答案 3 :(得分:6)

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

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