QTimerEvent用来描述一个定时器事件。队医一个QObject的子类,只需要使用Int
参考文献:《Qt Creator 快速入门》第三版 霍亚飞编著
QObject::startTimer(int interval)函数就可以开启一个定时器。输入参数是毫秒为单位的整数,表明设定的时间。返回值为一个整型值,代表这个定时器的编号。当定时器溢出(即定时时间达到时)可以在timerEvent函数中进行需要的操作。
Qt中使用qrand和qsrand两个函数实现随机数。
新建Qt Widgets项目mytimerevent继承自QtWidget,类名默认Widget。
widget.h中添加函数声明如下
protected:
void timerEvent(QTimerEvent *event);
添加三个私有成员变量如下
int id1,id2,id3;
然后在widget.cpp的构造函数中,起3个定时器,定时时间分别为1秒,1.5秒,2秒,代码如下。
id1=startTimer(1000);
id2=startTimer(1500);
id3=startTimer(2000);
定时器事件处理函数实现如下
void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId()==id1)//判断是哪个定时器
{
qDebug()<<"timer 1";
}
else if(event->timerId()==id2)
{
qDebug()<<"timer 2";
}
else if(event->timerId()==id3)
{
qDebug()<<"timer 3";
}
}
运行效果打印如下信息
前面是实现QObject中的startTimer函数,其实编程中更多使用的是QTimer类实现一个定时器。它提供了更高层次的编程接口。下面使用 QTimer实现一个简单电子表功能。
上面工程中继续添加内容,在设计模式中添加LCD Number部件。
widget.h中添加私有槽声明如下。
private slots:
void timerUpdate();
在widget.cpp中包含头文件
#include <QTimer>
#include <QTime>
在构造函数中启动定时器并将定时器溢出信号关联到槽上,代码如下
QTimer* timer=new QTimer(this);//创建定时器
connect(timer,&QTimer::timeout,this,&Widget::timerUpdate);//关联定时器的溢出信号到槽上
timer->start(1000);//设置溢出时间为1秒,并启动定时器
实现定时器溢出信号槽函数代码如下
void Widget::timerUpdate()
{
QTime time=QTime::currentTime();//获取当前时间
QString text=time.toString("hh:mm");//转换为字符串
if((time.second()%2)==0)
text[2]=' ';//每隔一秒将":"显示为空格
ui->lcdNumber->display(text);
}
使用QTime::currentTime获取当前时间,使用QTime的second()函数来获取秒的值,并与2取余,为0就将‘:’显示为空格,实现一秒闪烁一下的效果。
最后运行效果如下
使用随机数函数来让LCD部件每隔一秒移动一个随机位置。
在构造函数中添加
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
这里的意思是以从0点到当前时间的秒数,作为qsrand的参数,即作为随机数的初始值。如果不设置初值,每次运行程序会产生相同的一组随机数。
在timerUpdate函数里添加以下代码
int rand=qrand()%300;//产生300以内的整随机数
ui->lcdNumber->move(rand,rand);
最后说一下使用QTimer::singleShot函数开启一个只运行一次的定时器。