当前位置: 首页 > news >正文

Qt中如何在同一个类中共享使用一个Qtimer

#创作灵感#

        当你在一个类中需要多个地方使用定时器,但是又不需要为每一个操作定义一个定时器变量。因为它们之间的行为是单一的。

         例如:某个程序需要播放警告声音,同一时间只能播放一个警告声音。一共有10种警告声音,需要根据优先级来播放。每次播放间隔时间根据需求来调整。这个时候有什么好的办法呢?

         在具体的需求实验中,经过不断调整,最终找到了一种共享定时器的方法。具体做法如下:

一、定义定时器:

class ShareTimer: public QObject {
    ...
private:
    QTimer                         *m_playTimer;
    static QMetaObject::Connection m_connection;
};

二、使用定时器的地方:


QMetaObject::Connection ShareTimer::m_connection;


void playAlarm1(const bool &isStop)
{
    if( isStop)
    {
        m_playTimer->stop();
        if( m_connection )
        {
            disconnect(m_playTimer, &QTimer::timeout, this, nullptr);
            QObject::disconnect(m_connection);  // 断开连接
            
        }
        
        
        // 连接 QTimer 的 timeout 信号到一个 lambda 函数
        if( m_connection )
        {
            DEBUG<<"connection already success.....";
        }
        else
        {
            // 设置定时器每1000毫秒(即1秒)触发一次
            m_playTimer->setInterval(1000);
            //[捕获列表](参数列表) -> 返回类型 { 函数体 }
            m_connection = QObject::connect(m_playTimer, &QTimer::timeout, this ,  [this]() {
                if( g_AudioCtrl )
                    g_AudioCtrl->playWavFile("DirectAlarmPriority",DirectAlarmPriority::D_BSD );
                DEBUG<<" playWavFile...............D_BSD.............. "<<"\n";
                
            });
            
            // 启动定时器
            m_playTimer->start();
        }
    }
    else
    {
        m_playTimer->stop();
        if( g_AudioCtrl )
            g_AudioCtrl->stopWavPlayer("DirectAlarmPriority",DirectAlarmPriority::D_BSD );
        if( m_connection )
        {
            disconnect(m_playTimer, &QTimer::timeout, this, nullptr);
            QObject::disconnect(m_connection);  // 断开连接
            
        }
        else
        {
            DEBUG<<"connection is disconnect.......";
        }
        m_is0x04PlayState = false;
        DEBUG<<" disconnect.............................connection = "<<m_connection;
    }
    
}

相关文章:

  • Apache Hive:基于Hadoop的分布式数据仓库
  • 拥抱人工智能大模型时代:大模型会改变我们的生活吗?
  • linux之qt打包 linuxdeployqt
  • android 去掉状态栏的方法汇总
  • JAVA小项目:拼图游戏(简单易懂可上手)
  • fastapi 实践(三)Swagger Docs
  • 前端知识-CSS(二)
  • LeetCode hot 100 每日一题(14)——54.螺旋矩阵
  • 部署高可用PostgreSQL14集群
  • C# 中实现一个线程持续读取,另一个线程负责写入,且写入时读取线程暂停
  • 闲聊IT - 面向服务架构(SOA)的发展历史
  • Powershell 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
  • 【简单学习】Prompt Engineering 提示词工程
  • redis7.4.2单机配置
  • 安全上网沙箱:多方面解决政企私的上网问题
  • [AI速读]混合验证方案:如何高效解决RISC-V向量扩展的验证难题
  • 前端实现截图功能
  • 帕金森病致生活艰难,如何缓解心理负担?
  • 什么是ClickHouse
  • TDengine又新增一可视化工具 Perspective
  • 澎湃回声|山东莱州、潍坊对“三无”拖拉机产销市场展开调查排查
  • 企业取消“大小周”引热议,半月谈:不能将显性加班变为隐性加班
  • “五一”假期倒计时,节前错峰出游机票降价四成
  • BNEF:亚洲、中东和非洲是电力基础设施投资的最大机会所在
  • 柴德赓、纪庸与叫歇碑
  • 持续更新丨伊朗内政部长:港口爆炸已致8人死亡750人受伤