Qt如何根据IF条件自动关闭QMessageBox并隐藏OK按钮
问题根源
你现有代码存在两个核心问题导致无法自动关闭弹窗:
QMessageBox::exec()是阻塞式调用,弹窗弹出后程序会卡在这行代码等待用户交互,后续检测value==1的逻辑根本无法执行,自然没法主动关闭弹窗- 你把
msgBox定义为局部变量,出了当前代码块后对象就被销毁了,就算后续想调用close()也找不到对应的弹窗对象
具体实现方案
步骤1:定义类成员变量
在你当前类的头文件(.h)中添加弹窗成员变量,保证后续业务逻辑可以访问到该对象:
#include <QMessageBox> class YourClass : public QWidget // 替换为你自己的类继承关系 { // 其他类定义内容 private: QMessageBox* m_sensorDisconnectMsg = nullptr; };
步骤2:修改业务逻辑代码
用非模态的show()代替阻塞的exec(),同时隐藏所有默认按钮:
if (topic==TOPIC_DEVICE) { switch(reg) { case STIM_REG_NUM_SENSORS: if(value==0){ // 避免重复创建弹窗 if(!m_sensorDisconnectMsg){ m_sensorDisconnectMsg = new QMessageBox(this); m_sensorDisconnectMsg->setText("传感器已断开...."); m_sensorDisconnectMsg->setWindowTitle("传感器提示"); // 隐藏所有默认按钮,包括OK按钮 m_sensorDisconnectMsg->setStandardButtons(QMessageBox::NoButton); // 如果需要挡住父窗口操作,可开启模态,仍不会阻塞线程 // m_sensorDisconnectMsg->setModal(true); // 非模态显示 m_sensorDisconnectMsg->show(); } } else if(value==1){ // 检测到重连,关闭并销毁弹窗 if(m_sensorDisconnectMsg){ m_sensorDisconnectMsg->close(); m_sensorDisconnectMsg->deleteLater(); m_sensorDisconnectMsg = nullptr; } } break; } }
补充说明
如果不想每次断开都重新创建弹窗,也可以只初始化一次,重连的时候调用hide()隐藏,下次断开直接show()复用即可,可减少内存开销。
内容的提问来源于stack exchange,提问作者tetra
相关产品推荐
相关产品推荐

