• Qt中定时器的3种实现方法


    一.使用QTimer定时器类(首选)

    1.示例代码

    MainWindow::MainWindow(QWidget *parent)

        : QMainWindow(parent)

        , ui(new Ui::MainWindow)

    {

        ui->setupUi(this);

        ui->setupUi(this);

        time1 = new QTimer();

        time1->setInterval(1000);

        connect(time1,SIGNAL(timeout()),this,SLOT(onTimeOut()));

        time1->start();

    }

    void MainWindow::onTimeOut()

    {

        static int value = 0;

        qDebug()<<"count:"<< value++;

        if(value > 100)

            time1->stop();

    }

    QTimer类的简单介绍,成员函数:

    QTimer::QTimer ( QObject * parent = 0, const char * name = 0 )

    构造一个被称作name,父对象为parent的定时器

    QTimer::~QTimer ()

    销毁这个定时器。

    void QTimer::setInterval ( int msec )

    设定定时间隔为msec毫秒。如果这个定时器信号是运行的,它将会被停止并且重新开始,否则它将会被开始。

    bool QTimer::isActive () const

    如果定时器正在运行,返回真,否则返回假。

    void QTimer::singleShot ( int msec, QObject * receiver, const char * member ) [静态]

    这个静态函数在一个给定时间间隔之后调用一个槽。

    int QTimer::start ( int msec, bool sshot = FALSE )

    开始一个msec毫秒定时的定时器。如果sshot为真,这个定时器将只会被激活一次,否则它将会持续到它被停止

    void QTimer::stop ()

    停止这个定时器。

    void QTimer::timeout () [信号]

    当定时器被激活时,这个信号被发射。

    二.QObject中的定时器的使用

    QObject是所有Qt对象的基类,它提供了一个基本的定时器。

    1.需要用到三个函数

    (1).int QObject::startTimer ( int interval ) ;

    这个是开启一个定时器的函数,他的参数interval是毫秒级别。当开启成功后会返回这个定时器的ID, 并且每隔interval 时间后会进入timerEvent 函数,直到定时器被杀死。

    该函数的声明为:int startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer);   

    该函数开启一个定时器,返回值是定时器的编号。

    参数一为时间间隔,单位毫秒;

    参数二为定时器的精确度:

    Qt::PreciseTimer(精确的定时器,尽量保持毫秒精度,试图保持精确度在1毫秒);

    Qt::CoarseTimer(粗略的定时器,尽量保持精度在所需的时间间隔5%范围内);

    Qt::VeryCoarseTimer(很粗略的定时器,只保留完整的第二精度,大约为500毫秒);

    说明:默认是选择Qt::CoarseTimer模式

    (2).void QObject::timerEvent ( QTimerEvent * event );

    当定时器超时后,会进入该事件timerEvent函数,需要重写timerEvent函数,在函数中通过判断event->timerId()来确定定时器,然后执行某个定时器的超时函数。

    (3).void QObject::killTimer ( int id );

    通过从startTimer返回的ID传入killTimer 函数中杀死定时器,结束定时器进入超时处理。

    注意:kilTimer杀死定时器后,必须再重新创建定时器才能启用定时器。

    2.代码示例

    (1)test.h

        int timerid1;

        int timerid2;

        void timerEvent(QTimerEvent *e);

    (2)test.cpp

    MainWindow::MainWindow(QWidget *parent)

        : QMainWindow(parent)

        , ui(new Ui::MainWindow)

    {

        ui->setupUi(this);

        timerid1 = startTimer(1000,Qt::PreciseTimer);

        timerid2 = startTimer(2000,Qt::PreciseTimer);

    }

    void MainWindow::timerEvent(QTimerEvent *e)

    {

        if(e->timerId()==timerid1)

        {

            qDebug("timer1");

        }

        else if(e->timerId()==timerid2)

        {

            qDebug("timer2");

        }

    }

    void MainWindow::on_pushButton_clicked()

    {

        killTimer(timerid1);

        timerid1 = 0;

    }

    void MainWindow::on_pushButton_2_clicked()

    {

        timerid1 = startTimer(2000);

    }

    三.静态的singleShot ()函数创建单触发定时器(不推荐)

    singleShot函数是一个静态函数,表示只会在被调用时会执行一次操作。其中msec参数是时间,单位为ms,借助此函数可以简单实现一个定时器,定时为100s。

    QTimer::singleShot(1*1000,this, &MainWindow::count);

    void MainWindow::count()

    {

        static int num=0;

        qDebug()<<"count:"<< num;

        if(num < 100)

        {

            QTimer::singleShot(1*1000,this, &MainWindow::count);

            num += 1;

            qDebug()<

        }

    }

  • 相关阅读:
    【python中级】linux系统获得计算机网卡流量
    MySQL基础篇总结
    通过postgis空间库导入sql格式的矢量数据到arcgis中
    C语言之文件操作篇(2)
    Spring源码阅读(spring-framework-5.2.24)
    HONEYWELL 0574-A-012 0574-A-0131 工控DCS系统模块
    自己搜的算法题2.0
    9/19 深搜+网络流
    【鸿蒙学习笔记】鸿蒙ArkTS学习笔记
    开源版商城源码V2.0【小程序 + H5+ 公众号 + APP】
  • 原文地址:https://blog.csdn.net/xieliru/article/details/137855833