Qt事件系统之四:定时器事件与随机数

一、定时器事件和随机数

QTimerEvent类用来描述一个定时器事件。对于一个QObject的子类,只需要使用int QObject::startTimer ( int interval)函数来开启一个定时器,这个函数需要输人一个以毫秒为单位的整数作为参数来表明设定的时间,它返回一个整型编号来代表这个定时器。当定时器溢出时就可以在timerEvent()函数中获取该定时器的编号来进行相关操作。

其实编程中更多的是使用QTimer类来实现一个定时器,它可以使用信号和槽,还可以设置只运行一次的定时器。所以如果使用定时器,那么一般都是使用的QTimer类。

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


二、通过ID使用定时器

使用QTimerEvent的timerId()函数来获取定时器的编号,然后判断是哪一个定时器并分别进行不同的操作。

在头文件.h中进行声明:

private:
    Ui::Widget *ui;

    int id1,id2,id3; //定时器的编号

protected:
    void timerEvent(QTimerEvent *event); //定时器事件

在.cpp中进行实现相应的功能:

//构造函数
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    id1 = startTimer(1000); //开启一个1秒定时器,并返回其id
    id2 = startTimer(2000);
    id3 = startTimer(4000);
}

//定时器事件
void Widget::timerEvent(QTimerEvent *event)
{
    //1秒钟时间到,则定时器1溢出
    if (event->timerId() == id1)
    {
        qDebug()<<"timer1";
    }
    else if(event->timerId() == id2)
    {
        qDebug()<<"timer2";
    }
    else if (event->timerId() == id3)
    {
        qDebug()<<"timer3";
    }
}

“应用程序输出”窗口输出如下:

timer1
timer1
timer2
timer1
timer1
timer2
timer3

三、通过信号和槽实现定时器

在头文件.h中进行声明:

private slots:
    void timeOut(); //定时器超时函数

在.cpp中进行实现相应的功能:

//构造函数
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建一个新的定时器
    QTimer *timer = new QTimer(this);
    //设置定时器1秒钟超时
    timer->start(1000);
    //关联定时器的超时信号到槽上
    connect(timer,SIGNAL(timeout()),this,SLOT(timeOut()));
}

Widget::~Widget()
{
    delete ui;
}

//定时器超时函数
void Widget::timeOut()
{
    QTime time = QTime::currentTime();      // 获取当前时间
    QString text = time.toString("hh:mm:ss");  // 转换为字符串
    if((time.second() % 2) == 0)
    {
        //每隔一秒就将“:”显示为空格
        text[2]=' ';
        text[5]=' ';
    }
    qDebug() << text;
}

这里在构造函数中开启了一个1秒的定时器,当它溢出时就会发射timeout()信号,这时就会执行我们的定时器溢出处理函数。在槽里我们获取了当前的时间,并且将它转换为可以显示的字符串。

“应用程序输出”窗口输出如下:

"15:36:23"
"15 36 24"
"15:36:25"
"15 36 26"

四、随机数

在头文件.h中进行声明:

private slots:
    void timeOut(); //定时器超时函数

在.cpp中进行实现相应的功能:

//构造函数
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建一个新的定时器
    QTimer *timer = new QTimer(this);
    //设置定时器1秒钟超时
    timer->start(1000);
    //关联定时器的超时信号到槽上
    connect(timer,SIGNAL(timeout()),this,SLOT(timeOut()));

    //使用qsrand()函数为随机数设置初值
    qsrand(static_cast<uint>( QTime(0, 0, 0).secsTo(QTime::currentTime()) ));
}

//定时器超时函数
void Widget::timeOut()
{
    int rand = qrand()%300;//产生300以内的正整数
    qDebug()<< rand;
}

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

为了每次运行程序时,都可以产生不同的随机数,我们要使用qsrand()设置一个不同的初值。这里使用了QTime类的secsTo()函数,它表示两个时间点之间所包含的秒数,比如代码中就是指从零点整到当前时间所经过的秒数。

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

“应用程序输出”窗口输出如下:

112
212
223
102

参考:

56 QT定时器事件和随机数

原文地址:https://www.cnblogs.com/linuxAndMcu/p/11023695.html