定时器事件和随机数
QTimerEvent类用来描述一个定时器事件。对于一个QObject的子类,只需要使用int QObject::startTimer ( int interval )函数来开启一个定时器,这个函数需要输入一个以毫秒为单位的整数作为参数来表明设定的时间,它返回一个整型编号来代表这个定时器。当定时器溢出时就可以在timerEvent()函数中获取该定时器的编号来进行相关操作。
编程中更多的是使用QTimer类来实现一个定时器,它提供了更高层次的编程接口,比如可以使用信号和槽,还可以设置只运行一次的定时器。所以在以后的章节中,如果使用定时器,那么一般都是使用的QTimer类。
关于随机数,在Qt中是使用qrand()和qsrand()两个函数实现的
通过ID使用定时器
使用QTimerEvent的timerId()函数来获取定时器的编号,然后判断是哪一个定时器并分别进行不同的操作。
在构造函数中:
int timer_id1; // 开启一个1秒定时器,返回其ID
int timer_id2;
int timer_id3;
下面是定时器事件函数的定义:
void Widget::timerEvent(QTimerEvent *event)
{
if (event->timerId() == timer1) {
qDebug()<<"timer1";
} else if(event->timerId() == timer2) {
qDebug()<<"timer2";
} else if (event->timerId() == timer3) {
qDebug()<<"timer3";
}
}
通过信号和槽实现定时器
在构造函数中添加:
QTimer *timer = new QTimer(this); // 创建一个新的定时器
// 关联定时器的溢出信号到槽上
connect(timer,SIGNAL(timeout()),this,SLOT(timerUpdate()));
timer->start(1000);
槽函数实现:
void Widget::timerUpdate() // 定时器溢出处理
{
QTime time = QTime::currentTime(); // 获取当前时间
QString text = time.toString("hh:mm"); // 转换为字符串
if((time.second() % 2) == 0) text[2]=' '; // 每隔一秒就将“:”显示为空格
ui->lcdNumber->display(text);
}
这里在构造函数中开启了一个1秒的定时器,当它溢出时就会发射timeout()信号,这时就会执行我们的定时器溢出处理函数。在槽里我们获取了当前的时间,并且将它转换为可以显示的字符串。
随机数
添加随机数种子,
构造函数里添加一行代码:
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
然后在timerUpdate()函数里面添加如下代码:
int rand = qrand() % 300; // 产生300以内的正整数
ui->lcdNumber->move(rand, rand);
在使用qrand()函数产生随机数之前,一般要使用qsrand()函数为其设置初值,如果不设置初值,那么每次运行程序,qrand()都会产生相同的一组随机数。为了每次运行程序时,都可以产生不同的随机数,我们要使用qsrand()设置一个不同的初值。这里使用了QTime类的secsTo()函数,它表示两个时间点之间所包含的秒数,比如代码中就是指从零点整到当前时间所经过的秒数。当使用qrand()要获取一个范围内的数值时,一般是让它与一个整数取余,比如这里与300取余,就会使所有生成的数值在0-299之间(包含0和299)。