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;
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu-Eleven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值