You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QMessageBox确认弹窗异常:点击No仍关闭应用,求排查原因

问题分析与解决

你提供的这段弹窗逻辑本身是正确的——只有点击「Yes」才会调用QApplication::quit(),理论上点击「No」不会触发应用退出。问题大概率出在代码外的其他关联逻辑里:

  • 按钮信号重复关联
    检查UI设计器中该pushButton的信号连接,是否除了on_pushButton_clicked槽外,还额外连接了窗口的close()槽。如果是,点击按钮时会同时触发弹窗和窗口关闭操作:无论你选「Yes」还是「No」,窗口都会关闭,而如果这个窗口是应用的最后一个窗口(quitOnLastWindowClosed默认开启),应用就会随之退出。

  • 窗口关闭事件被重写
    查看secondwindow类是否重写了closeEvent函数,比如存在类似代码:

    void secondwindow::closeEvent(QCloseEvent *event)
    {
        QApplication::quit();
        event->accept();
    }
    

    如果是这样,只要窗口关闭(比如误操作触发),就会直接调用quit(),和弹窗选择无关。

  • 其他代码触发退出
    排查项目中其他可能调用QApplication::quit()或qApp->exit()的逻辑,是否在弹窗关闭时被意外触发。

验证方法

在弹窗逻辑中添加日志输出,确认quit()的执行时机:

#include <QDebug>

void secondwindow::on_pushButton_clicked()
{
    QMessageBox msg;
    msg.setWindowTitle("Quit");
    msg.setText("Are you sure you want to quit?");
    msg.setIcon(QMessageBox::Question);
    msg.setStandardButtons(QMessageBox::Yes|QMessageBox::No);
    msg.setStyleSheet(QString::fromUtf8("background-color: white;"));
    if(msg.exec()==QMessageBox::Yes){
        qDebug() << "触发Yes,执行退出";
        QApplication::quit();
    } else {
        qDebug() << "触发No,不执行退出";
    }
}

如果点击「No」时控制台输出「触发No,不执行退出」但应用依然退出,说明退出操作是其他代码导致的,重点排查上述前两点。

内容的提问来源于stack exchange,提问作者Anastasia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:15:41