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

一、定时器

在头文件.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->setInterval(100);        
    // 关联定时器的超时信号到槽上
    connect(timer, SIGNAL(timeout()), this, SLOT(timeOut()));
	// 开始计时
    timer->start();      
}

// 定时器超时槽函数
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"

如果我们想让这个计时器只计时一次,那么必须使用void setSingleShot(bool singleShot)函数。

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timeOut()));
timer->setsetSingleShot(true)
timer->start(60000);

这样计时器只会倒计时 1 分钟,然后结束。


二、定时事件

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

使用 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()));

    // 使用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定时器事件和随机数


posted @ 2019-06-14 15:51  fengMisaka  阅读(3724)  评论(0编辑  收藏  举报