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

新手上路,请多包涵

在 Qt 中,对应于用户单击窗口框架的“X”(关闭)按钮的事件的插槽是什么,即这个按钮:

窗口的关闭按钮

如果没有这个插槽,在用户按下关闭按钮后,还有其他方法可以触发功能吗?

原文由 Shravan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

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

原文由 asclepix 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

原文由 Shravan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题