You need to enable JavaScript to run this app. Qt中QMessageBox按钮判定逻辑失效 无论选Yes/No均触发deleteYear执行
优惠活动
大模型
产品
解决方案
定价
更多

Qt中QMessageBox按钮判定逻辑失效 无论选Yes/No均触发deleteYear执行

QMessageBox确认弹窗判断逻辑异常修复

核心问题

你写的判断逻辑从根上就错了:if (messageBox.QMessageBox::Yes)这行代码根本不是在判断用户点了哪个按钮。
C++里通过对象访问类的静态成员,最终获取的是类本身定义的固定枚举值——QMessageBox::Yes这个枚举常量本身是非0的固定数值,不管用户在弹窗上点了Yes还是No,这个判断条件永远是真,自然会不管选啥都触发后面的删除逻辑。

修正方案

QMessageBox的用户交互结果,只能通过exec()方法的返回值拿到。exec()调用后会阻塞住流程,直到用户点按钮关掉弹窗,返回值就是用户实际点击按钮对应的枚举值。

修正后的完整代码:

void deletetable::on_pb_dell_clicked()
{
    QMessageBox messageBox(QMessageBox::Question,
            tr("Sure want to quit?"), tr("Sure to quit?"), QMessageBox::Yes | QMessageBox::No, this);
    messageBox.setButtonText(QMessageBox::Yes, tr("Yes"));
    messageBox.setButtonText(QMessageBox::No, tr("No"));
    int clicked = messageBox.exec();
    if (clicked == QMessageBox::Yes) {
        emit deleteYear(year);
        close();
    }
}

补充说明

  • 没必要留空的else分支,没有对应逻辑的情况下直接省略即可
  • 写法上可以简化,不用额外定义变量存返回值,直接判断:
    if (messageBox.exec() == QMessageBox::Yes) {
        emit deleteYear(year);
        close();
    }
    
  • 不要尝试通过QMessageBox实例的属性去判断用户选择,Qt的QMessageBox设计上就是通过exec()返回值传递交互结果的,没有额外的状态接口可以直接取用户点的按钮

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 19:06:03