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找到的问题。
相关推荐
柳鲲鹏9 小时前
QT:正确延时调用,Cannot create children for a parent that is in a different thread.
服务器·数据库·qt
(Charon)9 小时前
【C++/Qt】Qt 实现 WebSocket 测试工具:连接、消息收发与通信日志
c++·qt·websocket
十五年专注C++开发9 小时前
CMake基础: Qt之qt5_wrap_ui
开发语言·c++·qt·ui
(Charon)9 小时前
【C++/Qt】Qt 实现 HTTP 测试工具:从请求构思到 GET/POST 实现
c++·qt·http
jf加菲猫9 小时前
第16章 容器类
开发语言·c++·qt·ui
人道领域9 小时前
从零实现一个轻量级 RPC 框架:通信协议与动态代理的核心原理
开发语言·网络·qt
rrr29 小时前
【PyQt5】| 多线程设计模式
开发语言·qt·设计模式
用户805533698031 天前
现代Qt开发教程(新手篇)1.10——进程
c++·qt
vegetablesssss1 天前
VTK切割图
c++·qt·vtk
Lhan.zzZ1 天前
笔记_2026.4.28_003
c++·笔记·qt·opencv