低级定时器之QBasicTimer

       QBasicTimers 是一个很快的、轻量级的定时器类,它主要被Qt内部使用。所以,我们一般不建议在上层应用程序中直接使用这个类去做定时器工作。在开发应用程序时,我们一般推荐使用QTimer类和QObject的成员函数startTimer来启动定时器。在此,只是出于学习还简单介绍一下QBasicTimer类的使用。还有,该定时器是一种重复性定时器,即它在启动后会不断的向应用程序发送定时器事件,直到你收到调用stop() 时才停止。

        当然,这个类的使用也非常简单。一般我们只需要创建一个该类的对象,然后调用它的start() 方法即可。start()方法的具体声明如下:

void QBasicTimer::start(int msec, QObject *object)
void QBasicTimer::start(int msec, Qt::TimerType timerType, QObject *obj)

其中,msec参数表示定时器的时间间隔,以毫秒为单位,object参数表示接受定时器到期事件的对象,timerType参数表示启动的定时器的类型。具体定义如下:

Qt::PreciseTimer    0  Precise timers try to keep millisecond accuracy
Qt::CoarseTimer     1  Coarse timers try to keep accuracy within 5% of the desired interval
Qt::VeryCoarseTimer 2  Very coarse timers only keep full second accuracy


另外,使用start() 函数启动定时器后,我们随时可以使用stop() 函数来停止它;使用isActive() 函数来判断一个定时器是否正在运行,“正在运行”表示它已经被启动,还为达到超时时间,并且未被stop() 停止;可以通过timerId() 来获得定时器的id。

       下面,我们在QtCreator中新建一个窗口程序,往窗口上托入一个列表控件QListWidget,然后,使用这个定时器,每秒向列表中添加一个字符串。步骤如下:

       1.新建一个Qt Widget应用程序,命名为BasicTimer,选择QWidget作为我们窗口的基类。

低级定时器之QBasicTimer_第1张图片

低级定时器之QBasicTimer_第2张图片

低级定时器之QBasicTimer_第3张图片


       2.双击widget.ui文件,进入Qt的设计模式,向窗口上拖一个QListWidget

   低级定时器之QBasicTimer_第4张图片


         低级定时器之QBasicTimer_第5张图片


    3.回到编辑模式,在widget.h中添加一个QBasicTimer的对象,并重新QWidget类的timerEvent(QTimerEvent* event)虚函数。该函数就是用来响应定时器的timeout事件的。代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    void timerEvent(QTimerEvent *event);

private:
    QBasicTimer timer;

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

        4.在widget.cpp 源文件中实现timerEvent() 函数即可。代码如下:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    timer.start(1000, Qt::PreciseTimer, this);
}

void Widget::timerEvent(QTimerEvent *event)
{
    ui->listWidget->addItem("timeout");
}

Widget::~Widget()
{
    timer.stop();
    delete ui;
}

在此,我们在构造函数中,通过QBasicTimer的start() 函数,开启一个高精度的定时器,定时间隔为1秒,让当前窗口来接收定时器到期事件。在timerEvent() 中,我们简单的向窗口上的list控件中添加一个字符串。当程序退出,我们在窗口的析构函数中调用stop() 停止定时器。

        5. 点击左下角的运行按钮,即可看到结果。每隔1秒,都会向list控件中添加一个字符串。如下:

                    低级定时器之QBasicTimer_第6张图片










你可能感兴趣的:(Qt)