当前位置:网站首页>2020-9-23 QT的定时器Qtimer类的使用。
2020-9-23 QT的定时器Qtimer类的使用。
2022-07-02 06:22:00 【qq_40938175】
在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器;一种是使用QTimer类。
定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度。
■、QObject类的定时器
QObject是所有Qt对象的基类,它提供了一个基本的定时器。通过QObject::startTimer(),可以把一个一毫秒为单位的时间间隔作为参数来开始定时器,这个函数返回一个唯一的整数定时器的标识符。这个定时器开始就会在每一个时间间隔"触发",直到明确的使用这个定时器的标识符来调用QObject::killTimer()结束。
当定时器触发时,应用程序会发送一个QTimerEvent。在事件循环中,处理器按照事件队列的顺序来处理定时器事件。当处理器正忙于其它事件处理时,定时器就不能立即处理。
QObject类还提供定时期的功能。与定时器相关的成员函数有:startTimer()、timeEvent()、killTimer()。
QObject基类中的startTimer()和timerEvent()原型及说明如下:
int QObject::startTimer(int interval);
开始一个定时器并返回定时器ID,如果不能开始一个定时器,将返回0。定时器开始后,每隔interval毫秒间隔将触发一次超时事件,直到killTimer()被调用来删除定时器。如果interval为0,那么定时器事件每次发生时没有窗口系统事件处理。
virtual void QObject::timerEvent(QTimerEvent *event);
虚函数timerEvent()被重载来实现用户的超时事件处理函数。如果有多个定时器在运行,QTimerEvent::timerId()被用来查找指定定时器,对其进行操作。
当定时器事件发生时,虚函数timerEvent()随着QTimerEvent事件参数类一起被调用,重载这个函数可以获得定时器事件。
定时器的用法如下:
//头文件
class QNewObject : public QObject
{
Q_OBJECT
public:
QNewObject( QObject * parent = 0 );
virtual ~QNewObject();protected:
void timerEvent( QTimerEvent *event );
int m_nTimerId;
};//源文件
QNewObject::QNewObject( QObject * parent )
:QNewObject( parent )
{
m_nTimerId = startTimer(1000);
}QNewObject::~QNewObject()
{
if ( m_nTimerId != 0 )
killTimer(m_nTimerId);
}void QNewObject::timerEvent( QTimerEvent *event )
{
qDebug( "timer event, id %d", event->timerId() );
}
■、定时器类QTimer
定时器类QTimer提供当定时器触发的时候发射一个信号的定时器,他提供只触发一次的超时事件,通常的使用方法如下:
//创建定时器
QTimer *testTimer = new QTimer(this);
//将定时器超时信号与槽(功能函数)联系起来
connect( testTimer, SIGNAL(timeout()), this, SLOT(testFunction()) );
//开始运行定时器,定时时间间隔为1000ms
testTimer->start(1000);
...
//停止运行定时器
if ( testTimer->isActive() )
testTimer->stop();
QTimer还提供了一个简单的只有一次定时的函数singleShot()。
一个定时器在100ms后触发处理函数animateTimeout()并且只触发一次。代码如下:
QTimer::singleShot( 100, this, SLOT(animateTimeout()) );
第二种介绍:
定时器的使用非常简单,我们只需要以下几个步骤就可以完成定时器的应用:
1.产生一个定时器
QTimer *time_clock=new QTimer(parent);
2.连接这个定时器的信号和槽,利用定时器的timeout()
connect(time_clock,SIGNAL(timeout()),this,SLOT(slottimedone()));
即定时时间到就会发送timeout()信号,从而触发slottimedone()槽去完成某项事情
3.开始定时器,并设定定时周期
定时器定时有两种:start(int time)和setSingleShot(true)
其中start(int time)是表示每隔time秒就会重启定时器,可以重复触发定时,除非你利用stop()将定时器关掉。
而setSingleShot(true)则是仅仅启动定时器一次
我们工程中常用的是前者。
time_clock->start(2000);
备注:我在中文的官网上找到的关于定时器的用法是如下的使用格式:
QTimer *timer = new QTimer( myObject );
connect( timer, SIGNAL(timeout()), myObject, SLOT(timerDone()) );
timer->start( 2000, TRUE ); // 2秒单触发定时器
关于最后一句,timer->start( 2000, TRUE );在我实际应用中,加上TRUE编译器就会报错,不知道为什么,去掉就没有关系了。这个问题遗留下来,或许以后可以解决掉
边栏推荐
猜你喜欢
随机推荐
Sparse array (nonlinear structure)
CUDA中的Warp matrix functions
Three suggestions for all students who have graduated and will graduate
Monitoring uplink of VRRP
Ruijie ebgp configuration case
实现strStr() II
日志 - 7 - 记录一次丢失文件(A4纸)的重大失误
Singleton mode compilation
Redis - cluster data distribution algorithm & hash slot
LeetCode 77. 组合
Sudo right raising
The difference between session and cookies
链表(线性结构)
BGP 路由优选规则和通告原则
递归(迷宫问题、8皇后问题)
LeetCode 40. Combined sum II
The Chinese word segmentation task is realized by using traditional methods (n-gram, HMM, etc.), neural network methods (CNN, LSTM, etc.) and pre training methods (Bert, etc.)
LeetCode 27. 移除元素
LeetCode 78. subset
TensorRT的命令行程序