【问题标题】:Qt: How do I handle the event of the user pressing the 'X' (close) button?Qt:如何处理用户按下“X”(关闭)按钮的事件?
【发布时间】:2013-07-03 02:10:26
【问题描述】:

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

如果没有这个插槽,谁能给我一些其他方法,我可以在用户按下关闭按钮后启动一个功能。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

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


    如果您要继承 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的子类创建的,那么我怎样才能实现和上面一样的呢?
    • @pra16 connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp())); 应该可以工作。请参阅下面塞巴斯蒂安的回答。
    • 您可能还想对 MainWindow 使用 setAttribute(Qt::WA_QuitOnClose);
    • 你确定继承QDialog不会调用closeEvent吗?它对我有用,QCloseEvent 的文档说 事件处理程序 QWidget::closeEvent() 接收关闭事件 并且 QDialog 也是一个小部件,对吗?或者它是否与旧的 Qt 版本(
    • @incBrain 即使在 Qt 4.8 中,“X”按钮也会在 QDialog 中调用 closeEvent,但如果用户按下键盘上的 Esc,QDialog 会在不调用 @ 的情况下关闭987654333@.
    【解决方案2】:

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

    class foo : public QMainWindow
    {
        Q_OBJECT
    private:
        void closeEvent(QCloseEvent *bar);
        // ...
    };
    
    
    void foo::closeEvent(QCloseEvent *bar)
    {
        // Do something
        bar->accept();
    }
    

    【讨论】:

      【解决方案3】:

      您可以将 SLOT 附加到

      void aboutToQuit();
      

      您的 QApplication 的信号。此信号应在应用关闭前发出。

      【讨论】:

      • 我们使用它的方式是:connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
      • 但是,quote from the documentation:“请注意,在此状态下无法进行任何用户交互。”
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 2022-01-09
        相关资源
        最近更新 更多