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


126

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

窗口的关闭按钮

如果没有用于此的插槽,那么有人可以建议我其他一些方法,以便在用户按下关闭按钮后启动功能。

Answers:


169

如果您有一个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进行子类化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();
    }
}

如果我的应用程序是通过将QApplication子类化而创建的,那么如何实现与上述相同的功能?
prakashpun

@ pra16 connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));应该工作。请参阅下面的塞巴斯蒂安答案。
湿婆

1
您可能还希望将其setAttribute(Qt::WA_QuitOnClose);用于MainWindow。
Borzh

您确定不会调用QDialog的子类closeEvent吗?它对我有用,并且QCloseEvent的文档说事件处理程序QWidget :: closeEvent()接收关闭事件,而QDialog也是一个Widget,对吗?还是与旧版Qt(<5.x)相关?
Dimitri Podborski

1
@incBrain即使在Qt 4.8中,“ X”按钮closeEvent也会调用QDialog,但是如果用户按键盘上的Esc键,则QDialog将关闭而不进行调用closeEvent
asclepix

16

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

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


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


10

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

void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
    // do what you need here
    // then call parent's procedure
    QWidget::closeEvent(event);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.