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

