Qt—定时器事件与随机数

x33g5p2x  于2022-03-21 转载在 其他  
字(2.5k)|赞(0)|评价(0)|浏览(425)

定时器

QTimerEvent类用来描述一个定时器事件。

对于一个QObject的子类,只需要使用int QObject : : startTimer ( int interval)函数就可以开启一个定时器,这个函数需要输入一个以毫秒为单位的整数作为参数来表明设定的时间,函数返回一个整型编号来代表这个定时器。

当定时器溢出时可以在timerEvent()函数中进行需要的操作。

其实编程中更多的是使用QTimer类来实现一个定时器,它提供了更高层次的编程接口,比如可以使用信号和槽,还可以设置只运行一次的定时器。

所以在以后的章节中,如果使用定时器,那么一般都是使用的QTimer类关于定时器的介绍,可以在帮助中通过Timers关键字查看。

关于随机数,Qt中是使用qrand()和qsrand()两个函数实现的。

新建Qt Widgets应用,将项目名称更改为mytimerevent,基类选择QWidget,然后类名保持 Widget不变。完成后首先在 widget.h文件中添加函数声明:

protected:
    void timerEvent(QTimerEvent *event);

然后定义几个private私有变量:

int id1, id2, id3;

在widget.cpp文件中添加头文件#include< QDebug>
然后再构造函数中

id1 = startTimer(1000);                  // 开启一个1秒定时器,返回其ID
    id2 = startTimer(1500);
    id3 = startTimer(2200);

因为startTimer()函数的参数是以毫秒为单位的,这里使用1000,所以是1s,使用序号获取各个定时器的编号
1 2 3

下面添加定时器事件处理函数

void Widget::timerEvent(QTimerEvent *event)
{
    if (event->timerId() == id1) {       // 判断是哪个定时器
        qDebug() << "timer1";
    }
    else if (event->timerId() == id2) {
        qDebug() << "timer2";
    }
    else {
        qDebug() << "timer3";
    }
}

这里使用QTimerEvent的 timerId()函数来获取定时器的编号,然后判断是哪一个定时器并分别进行不同的操作。
现在运行程序,并看一下应用程序输出栏中的信息。

1时间少,1s的时候触发1,1.5s时候2,2s时候再触发1
,2.2s时候触发3,3s时候再触发2

下面使用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); //设置溢出时间为1s,并启动定时器

下面添加定时器溢出信号槽函数的定义:

void Widget::timerUpdate() //定时器溢出处理
{
    QTime time=QTime::currentTime();//获取当前时间
    QString text=time.toString("hh:mm");//转换为字符串 hh:mm形式
    if((time.second()%2)==0)
        text[2]=' ';//每隔一秒就将":"显示为空格
    ui->lcdNumber->display(text);

}

解释下这句if((time.second()%2)==0)
text[2]=’’;//每隔一秒就将":"显示为空格

就是先time.second读取秒数(0~60),再与2进行%2取余,如果为0,代表1s了,就让时分之间(test[2])的":"变为空格,这样便实现了每隔1s闪烁一下的效果。

如果想停止一个定时器,可以调用它的stop函数

随机数

下面看一下随机数的使用:

首先在widget.cpp文件中的构造函数中添加:
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

然后再timerUpdate函数中添加:

int rand=qrand()%300;
    ui->lcdNumber->move(rand,rand);

在使用qrand产生随机数之前,一般需要使用qsrand函数为其设置初始值,如果不设置初始值,那么每次运行程序qrand()都会产生相同的一组随机数。

这里使用了QTime类的secsTo函数,它表示二个时间点之间所包含的秒数,比如代码中就是指从零点整到现在时间所经过的秒数。
int rand=qrand()%300; //0~299s

当使用qrand要获取一个范围内的数值时候,一般是让它与一个整数取余,比如这里与300取余,就会使所有生成的数值在0~299。

ui->lcdNumber->move(rand,rand);
这时候就可以看到LCD 每隔一秒便移动一个随机位置

QTimer类中还有一个singleShot函数来开启一个只运行一次的定时器,下面使用这个函数让程序运行10s后自动关闭。在widget.cpp文件中的构造函数里添加:

QTimer::singleShot(10000,this,&Widget::close);//设置时间10s,close函数

这里将时间设置为10 s,溢出时便调用窗口部件的close()函数来关闭窗口。可以运行一下程序,等待10 s,程序会自动退出。

相关文章