在mfc框架中定时器采用settimer和killtimer系统API,很方便对定时器的管理。
若将此逻辑放入qt时不太好用了。
此时我们可以将定时器ID和超时使用自定义的类管理,达到和mfc类似的定时器使用方式。
上代码
timer.h
#ifndef TIMER_H
#define TIMER_H
#include <QObject>
#include <QMap>
class Timer : public QObject
{
Q_OBJECT
public:
explicit Timer(QObject *p = nullptr);
~Timer();
signals:
void TimeOut(QTmerEvent *event);
private:
QMap <int ,int>mapTimerLogicID;//key逻辑编号,值为真实编号
QMap <int ,int>mapTimerReallyID;//key真实编号,值为逻辑编号
public:
void SetTmer(int LogicID,int timeOut);
int GetLogicID(int reallyID);
void KillTimer(int LogicID);
private:
void timerEvent(QTimerEvent *event);
};
#endif
timer.cpp
#include "timer.h"
Timer::Timer(QObjectq *parent):QObject(parent)
{}
Timer::~Timer()
{
auto it = mapTimerLogicID.begin();
for(;it!=mapTimerLogicID.end();++it)
{KillTimer(it.key());}
}
void Timer::SetTimer(int LogicID,int timeOut)
{
if(mapTimerLogicID.find(LogicID) != mapTimerLogicID.end())
{
KillTimer(LogicID);
SetTimer(LogicID,timeOut);
}
else
{
mapTimerLogicID[LogicID]=startTimer(timeOut);
mapTimerReallyID[mapTimerLogicID[LogicID]] = LogicID;
}
}
int Timer::GetLogicID(int reallyID)
{
if(mapTimerReallyID.find(reallyID) != mapTimerReallyID.end())
{return mapTimerReallyID[reallyID];}
else{return -1;}
}
void Timer::KillTimer(int logicID)
{int reallyID =-1;
if(mapTimerLogicID.find(logicID) != mapTimerLogicID.end())
{
reallyID = mapTimerLogicID[logicID];
mapTimerReallyID.remove(reallyID);
mapTimerLogicID.remove(logicID);
killTimer(reallyID);
}
}
void Timer::timerEvent(QTimerEvent *event)
{emit TimeOut(event);}