Qt 定时器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 定时器相关的知识,希望对你有一定的参考价值。

参考技术A 如果此类继承于QObject,可以直接调用startTimer函数,函数原型如下:

此函数开启定时器,并返回定时器的ID。

另外通过重载timerEvent函数来进行事件处理,其函数原型如下:

在该函数中进行事件处理,可通过定时器ID的判断(event->timerId() == m_TimerID),来处理多个定时器。

关闭定时器的函数为killTimer,函数原型如下:

class Example:publicQWidget



    Q_OBJECT

public:

    Example(QWidget*parent= 0);

    ~ Example();

    virtualvoidtimerEvent(QTimerEvent*event);

private:

    int m_TimerID; //定时器ID

    int m_TimerLeaveSeconds; //定时器剩余秒数

;

Example::Example(QWidget*parent)

    :QWidget(parent),

    m_TimerID(-1),

    m_TimerLeaveSeconds(0)



    ui.setupUi(this);

    m_TimerID=startTimer(1000);



void Example::timerEvent(QTimerEvent*event)



    if(event->timerId() ==m_TimerID)

   

        //做相应的事件处理

        killTimer(m_TimerID);//达到条件,杀死定时器

   



在类中添加QTimer类型成员,使用start()来开始并且把它的timeout()信号函数连接到适当的槽。当这段时间过去了,它将会发射timeout()信号。

QTimer *timer = new QTimer(this);

connect(timer, SIGNAL(timeout()), this, SLOT(update()));

timer->start(1000);

start()函数是重载函数,其原型如下:

(1)void QTimer::start()

启动或者重新启动定时器,其时间间隔是interval,可通过 setInterval(int msec) 函数进行设置。

(2)void QTimer::start(int msec)

启动或者重新启动定时器,时间间隔单位是毫秒。

结束一个定时器。

connect函数进行信号与槽的连接,每隔设置的固定间隔就会执行槽函数(update())。

注意:如果在类头文件中声明了一个QTimer变量,并且在构造函数中new了,不要忘了在析构函数中delete,并置位NULL。

另外,QTimer的精确度依赖于底下的操作系统和硬件。绝大多数平台支持20毫秒的精确度,一些平台可以提供更高的。如果Qt不能传送定时器触发所要求的数量,它将会默默地抛弃一些。

(1)void QTimer::singleShot(int msec, const QObject * receiver, const char * member)

这是个静态函数,能够在给定的时间间隔后调用槽,并不是多次触发该槽函数,该槽函数只执行一次。使用此函数非常方便,也不必创建本地qTimer对象。

实例:

        #include <qapplication.h>

        #include <qtimer.h>

        int main( int argc, char **argv )

       

            QApplication a( argc, argv );

            QTimer::singleShot( 10*60*1000, &a, SLOT(quit()) );

                ... // 创建并且显示你的窗口部件

            return a.exec();

       

这个示例程序会自动在10分钟之后终止(也就是600000毫秒)。

receiver是正在接收的对象并且member是一个槽。时间间隔是msec。

(2)bool QTimer::isActive () const

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

(3)void QTimer::changeInterval ( int msec )

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

QT定时器

#include "digiclock.h"
#include<qtimer.h>
#include<QTime>
#include<QMouseEvent>
#include<qpalette.h>
Digiclock::Digiclock(QWidget* parent):QLCDNumber(parent)

QPalette p=palette();
p.setColor(QPalette::Window,Qt::blue);
setPalette(p);
setWindowFlags(Qt::FramelessWindowHint);
//setWindowOpacity(0.5);
QTimer* timer=new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(showTime()));
timer->start(1000);
showTime();
resize(150,60);
showcolon=true;

void Digiclock::showTime()

QTime time=QTime::currentTime();
QString string=time.toString("hh:mm:ss");
if(showcolon)

string[2]=':';
showcolon=false;

else

string[2]=' ';
showcolon=true;

setDigitCount(8);
display(string);

void Digiclock::mousepressevent(QMouseEvent* event)

if(event->button()==Qt::LeftButton)

drawposition=event->globalPos()-frameGeometry().topLeft();
event->accept();

if(event->button()==Qt::RightButton)

close();


void Digiclock::mousemoveevent(QMouseEvent * event)

if(event->buttons()&Qt::LeftButton)

move(event->globalPos()-drawposition);
event->accept();


提示这个QObject::connect: No such slot QLCDNumber::showTime() in ..\clock\digiclock.cpp:14,但是我是用的子类的showtime函数啊,没有用基类啊,这是什么原因呢,大神指教了

参考技术A 看一下你的DigiClock类的头文件中有没有Q_OBJECT宏,没有的话你这个类就不支持信号槽机制,即使你定义槽了也没用。

以上是关于Qt 定时器的主要内容,如果未能解决你的问题,请参考以下文章

Qt 精确定时器

Qt 精确定时器

Qt分析:Qt中的两种定时器(可是QObject为什么要提高定时器呢,没必要啊。。。)

Qt学习 之 定时器

QT 定时器的删除问题

Qt中两种定时器用法