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

The*_*der 108 c++ qt

我正在使用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)

  • @incBrain即使在Qt 4.8中,“X”按钮也会在QDialog中调用“closeEvent”,但如果用户按键盘上的_Esc_,则QDialog将关闭而不调用“closeEvent”。 (3认同)

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关闭之前提出此信号.

  • 但是,[引自文档](http://doc.qt.io/qt-5/qcoreapplication.html#aboutToQuit):"请注意,在此状态下无法进行用户交互." (3认同)
  • 我们使用它:``connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));`` (2认同)

小智 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)