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
相关产品推荐
相关产品推荐

