我的QT Creator学习笔记(十五)——事件系统定时器事件与随机数

QTimerEvent用来描述一个定时器事件。队医一个QObject的子类,只需要使用Int 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函数开启一个只运行一次的定时器。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章