qt showevent引发的问题

qt开发客户端项目,会出现监听日志重复打印问题。

  • 开发工具: qt creator 4.8.0
  • 事件: void MainWindow::showEvent(QShowEvent *event)
  • 业务情景: 使用socket编程,创建服务端监听外部设备的连接。当只有一个设备连接到服务端后,对设备进行监听。如设备提供的电压、电流 出现问题,或者设备没了心跳 ,以及联网断线 ,都会打印日志 以及给出报警提示 ,并且还会有报警提示音
  • 异常情况: 当上述业务场景中设备异常 ,就会产生多次报警,影响产品使用体验 ,并且还会打印多个重复日志
  • 问题原因: showEvent事件重复执行 ,导致创建多个服务器server实例注册多次重复监听,会导致问题。
  • 解决方法: 增加校验参数。判断页面是否是初次打开
  • 问题排查思路: 此问题不容易发现,本机几乎很难发现此问题,会因人使用电脑的操作习惯不同 容易触发此bug
  • 下面是关键代码: 主页面页面展示时注册的监听回调方法,每次隐藏主页面打开时都会执行此方法。
c++ 复制代码
void MainWindow::showEvent(QShowEvent *event) {
    // 设置当前用户名(每次显示都需要更新)
    this->ui->loginName->setText(QString("当前登录用户: %1").arg(this->loginName));
    this->initStatusDesc();
    
    // 只在首次显示时执行初始化
    if (isFirstShow) {
        isFirstShow = false;
        
        // 页面显示时启动定时器(只在首次启动)
        tipTimer->start(5000);
        clockTimer->start(1000);
        
        // 添加提醒监听
        connect(this->tipManager, &DevTipManager::timeoffTip, this, [=](DevErrorMsgDTO devErrMsgDto){
            // 打印控制台
            this->consolePrint(devErrMsgDto.errorMsgEnHance);
            // 异常提醒
            this->popErrorMsg(devErrMsgDto);
        });
        // 初始化服务器
        iniTcpServer();
        // 添加离线监控
        Myapp::Pairs onlinePairsConfig = Myapp::getPairsByKey(Myapp::DEADLINE_LIMIT_TIME);
        devOnlineMgr = new DevOnlineManager(this, &onlinePairsConfig);
        // 添加离线设备监控
        initSystemSetListener();
    }
    
    // 触发故障检查(每次显示都需要执行)
    emit SignalRelayer::instance()->updateStatus();
}

总结

  1. 发现问题的思路:有些问题是操作习惯原因,很难发现,可以询问AI解决,此问题就是它抓到的。
  2. 有的时候我们认为AI只会编程,只会修改自己编写的程序bug,其实任何事情只要让他理解后都能尽职起到作用。
  3. 这次用的AI是在编程工具Cursor中使用的GPT-5.1 codex找到的问题。
相关推荐
Larry_Yanan11 分钟前
Qt网络开发之基于 QWebEngine 实现简易内嵌浏览器
linux·开发语言·网络·c++·笔记·qt·学习
一然明月3 小时前
Qt QML 锚定(Anchors)全解析
java·数据库·qt
一只爱学习的小鱼儿3 小时前
使用QT编写粒子显示热力图效果
开发语言·qt
大树学长3 小时前
【QT开发】Redis通信相关(一)
redis·qt
笨笨马甲3 小时前
Qt 人脸识别
开发语言·qt
山上三树4 小时前
Qt QObject介绍
开发语言·qt
山上三树4 小时前
QObject、QWidget、Widget三者的关系
qt
坚定学代码4 小时前
qt c++ 局域网聊天小工具
c++·qt·个人开发
笨笨马甲5 小时前
Qt network开发
开发语言·qt
mengzhi啊1 天前
Qt Designer UI 界面 拖的两个 QLineEdit,想按 Tab 从第一个跳到第二个
qt