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