Qt: How do I handle the event of the user pressing the 'X' (close) button?

前端 未结 4 1088
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-02 06:50

I am developing an application using Qt. I don\'t know which slot corresponds to the event of \"the user clicking the \'X\'(close) button of the window frame\" i.e. this but

相关标签:
4条回答
  • 2020-12-02 07:02

    You can attach a SLOT to the

    void aboutToQuit();
    

    signal of your QApplication. This signal should be raised just before app closes.

    0 讨论(0)
  • 2020-12-02 07:05

    also you can reimplement protected member QWidget::closeEvent()

    void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
    {
        // do what you need here
        // then call parent's procedure
        QWidget::closeEvent(event);
    }
    
    0 讨论(0)
  • 2020-12-02 07:09

    Well, I got it. One way is to override the QWidget::closeEvent(QCloseEvent *event) method in your class definition and add your code into that function. Example:

    class foo : public QMainWindow
    {
        Q_OBJECT
    private:
        void closeEvent(QCloseEvent *bar);
        // ...
    };
    
    
    void foo::closeEvent(QCloseEvent *bar)
    {
        // Do something
        bar->accept();
    }
    
    0 讨论(0)
  • 2020-12-02 07:18

    If you have a QMainWindow you can override closeEvent method.

    #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();
        }
    }
    


    If you're subclassing a QDialog, the closeEvent will not be called and so you have to override 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();
        }
    }
    
    0 讨论(0)
提交回复
热议问题