Bootstrap

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()<<num;

    }

}

;