定时器的使用场景很多,例如2D绘图类的游戏开发中,可以用来进行界面的重绘刷新、人物动作帧切换等,还可以实现项目中时间的实时更新。
Qt中的定时器有两种实现方式:1)QTimer类 2)QObject中的定时器
由于QTimer类使用时不能支持多个定时器同时使用,因此一般使用第二种方式
QTimer类实现定时器
第一步
定时器对象在超时后会发出timeout()
信号,需要建立定时器类对象以及超时信号和对应槽函数的连接
添加槽函数声明
private slots:
void onTimeOut();
添加槽函数定义
void MyFirstWnd::onTimeOut()
{
qDebug() << "QTimer定时器触发了";
}
第二步
定义一个定时类对象:
private:
QTimer *m_pCountTimer;
第三步
创建定时器对象并建立信号和槽连接:
m_pCountTimer = new QTimer(this);
connect(m_pCountTimer, SIGNAL(timeout()), this, SLOT(onTimeOut()));
第四步
启动定时器:
m_pCountTimer->start(1000);
QObject中的定时器
QObject中的定时器的使用涉及三个函数:
startTimer(int interval)
:启动定时器,函数参数为毫秒值的时间间隔,开启成功后返回该定时器的ID,并每隔间隔时间后会重入定时事件函数。
killTimer(int id)
:传入指定的定时器ID来结束定时器
timerEvent(QTimerEvent *event)
:定时器启动后,每次超时都会进入该事件函数,因此需要重写这个函数,并可以通过参数event中的timerId来确定是哪个定时器,再去执行相应的操作。
第一步
定义相关的定时器ID,以及声明定时器事件函数:
public:
virtual void timerEvent(QTimerEvent *event);
private:
int m_nRepaintTimer; // 重绘定时器
int m_nWalkTimer; // 移动帧切换定时器
第二步
完成定时器事件函数的定义:
void GameWnd::timerEvent(QTimerEvent *event)
{
int timerId = event->timerId();
if (timerId == m_nRepaintTimer)
{
qDebug() << "m_nRepaintTimer定时器触发了";
}
else if (timerId == m_nWalkTimer)
{
qDebug() << "m_nWalkTimer定时器触发了";
}
}
第三步
启动定时器:
m_nRepaintTimer = startTimer(1500);
m_nWalkTimer = startTimer(1000);