QT qt定时器的使用stop后槽函数继续运行怎么办

1528人阅读
qt学习(15)
首先,Qt对象的基类QObject为我们提供了一个基本的定时器,它是通过定时器事件来触发的。其步骤如下:
step1:通过函数int QObject::startTimer(int interval)函数来启动一个定时器,其中参数interval为时间间隔,其时间单位为毫秒(ms);startTimer()函数的返回类型为int,这个整型数字是定时器的标识符,用来唯一标识这个此时由startTimer函数开启的定时器。
当然,我们可以同时打开多个定时器,并返回不同的定时器标识符,在事件处理函数中,我们可以利用QTimeEvent::timeId()函数来判断当前事件是由那个定时器触发的,后面的例子里面将详细介绍。
step2:开启定时器后,在每个时间间隔后会产生一个QTimeEvent事件,并进入事件循环等待处理;
step3:当等到QTimeEvent事件处理的时候,会调用timeEvent(QTimeEvent*)事件处理函数来处理这个定时器事件;
step4:开启定时器后,定时器事件会一直发生着,然后我们可以调用killTimer(int)函数来结束某个定时器,参数可以指定需要结束的定时器标识符。
下面做一个简单的计时器来说明之。
#include &QWidget&
class Ticker : public QWidget
Ticker(QWidget *parent = 0);
~Ticker();
protected:
void timerEvent(QTimerEvent *event);
int m_nTimerId;
int m_nTimerId2;
QLabel *label1;
QLabel *label2;
int number1;
int number2;
ticker.cpp
#include &QtGui&
#include &ticker.h&
#include &QTime&
Ticker::Ticker(QWidget *parent) : QWidget(parent)
m_nTimerId = startTimer(<span style="color:#00);
m_nTimerId2 = startTimer(<span style="color:#00);
label1 = new QLabel(tr(&00&));
label2 = new QLabel(tr(&00&));
label = new QLabel(tr(&:&));
QHBoxLayout *layout = new QHBoxLayout;
layout-&addWidget(label2);
layout-&addWidget(label);
layout-&addWidget(label1);
setLayout(layout);
number1 = <span style="color:#;
number2 = <span style="color:#;
void Ticker::timerEvent(QTimerEvent *event)
if(number1 & <span style="color:#)
number1&#43;&#43;;
label1-&setText(QString::number(number1));
else if(number1 &= <span style="color:#)
number1 = <span style="color:#;
&#43;&#43;number2;
label1-&setText(QString::number(number1));
label2-&setText(QString::number(number2));
Ticker::~Ticker()
if(m_nTimerId != <span style="color:#)
killTimer(m_nTimerId);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:47455次
积分:1145
积分:1145
排名:千里之外
原创:67篇
转载:13篇
(1)(3)(27)(10)(2)(5)(8)(1)(7)(7)(10)1032人阅读
可以用槽函数实现
(1)重载timerEvent(QTimerEvent *)函数,然后再在类的构造函数中设置时间间隔
startTimer(50);//单位为毫秒
(2)在类的构造函数中设定如下:
QTimer *timer=new&QTimer(this);
&&connect(timer,SIGNAL(timeout()),this,SLOT(timeoutslot()));&&timer-&start(1000);&&
然而:所有Qobject的子类在设置定时器时都不必加载一个Qtimer对象,因为这样造成了资源浪费且需要书写多余的函数,很不方便.最好的办法是重载timerEvent函数,具体写法如下:
class&Gui_DlgViewCtrlDatum
:&public&QDialog &&{ &&Q_OBJECT &&public:
&&Gui_DlgViewCtrlDatum( QWidget* parent = 0,&const&char*
name = 0,&bool&modal = FALSE, WFlags fl = 0 ); &&~Gui_DlgViewCtrlDatum(); &&protected:
&&void&timerEvent(
QTimerEvent * ); &&}; &&void&Gui_DlgViewCtrlDatum::timerEvent(
QTimerEvent *e ) &&{ &&&&}&&
再在Gui_DlgViewCtrlDatum的构造函数中设置时间间隔:
startTimer(50);//单位为毫秒
这样,每隔50毫秒,函数timerEvent便会被调用一次.
网上又说:
定时器事件的优先级很低,如果需要多个定时器,那么跟踪每一个定时器的ID是很费时的。这种情况下,较好的方法是为每一个定时器创建一个QTimer对象。在每一个时间间隔内,QTimer发出一个timeout()信号。QTimer还支持一次性定时器(只发出一次timeout()信号的定时器)。
定时器的使用非常简单,我们只需要以下几个步骤就可以完成定时器的应用:
  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);
  备注:我在中文的官网上找到的关于定时器的用法是如下的使用&#26684;式:
  QTimer *timer = new QTimer( myObject );
  connect( timer, SIGNAL(timeout()), myObject, SLOT(timerDone()) );
  timer-&start( 2000, TRUE ); // 2秒单触发定时器
  关于最后一句,timer-&start( 2000, TRUE );在我实际应用中,加上TRUE编译器就会报错,不知道为什么,去掉就没有关系了。这个问题遗留下来,或许以后可以解决掉
用这三条语就可以实现定时器每time秒触发一次,直到用timer-&stop()槽时才停止触发,要两个&#20540;得注意的槽函数而不是信号函数,timer-&start(int time),每隔time秒重起一次定时器,timer-&stop()取消定时,下面的代码可以循环触发,但若加一句代码timer-&(true)将会只启动定时器一次!
QTimer *timer = new QTimer(this);
注销掉此行就可以连续定时timer-&(true)
&&&&&&&connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));
&&&& timer-&start(time*1000);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:128082次
积分:1755
积分:1755
排名:千里之外
原创:18篇
转载:199篇
(3)(2)(2)(2)(3)(1)(5)(9)(15)(21)(44)(24)(77)(9)2013年2月 移动平台大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。博客访问: 864797
博文数量: 178
博客积分: 3640
博客等级: 中校
技术积分: 1758
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
在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
虚函数timerEvent()被重载来实现用户的超时事件处理函数。如果有多个定时器在运行,QTimerEvent::timerId()被用来查找指定定时器,对其进行操作。
当定时器事件发生时,虚函数timerEvent()随着QTimerEvent事件参数类一起被调用,重载这个函数可以获得定时器事件。
定时器的用法如下:
//头文件class QNewObject : public
Q_OBJECTpublic:
QNewObject( QObject * parent = 0
virtual ~QNewObject();
protected:
void timerEvent( QTimerEvent
int m_nTimerId;};
//源文件QNewObject::QNewObject( QObject *
:QNewObject( parent ){
m_nTimerId =
startTimer(1000);}
QNewObject::~QNewObject(){
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())
);//开始运行定时器,定时时间间隔为1000mstestTimer->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编译器就会报错,不知道为什么,去掉就没有关系了。这个问题遗留下来,或许以后可以解决掉
阅读(28875) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。15015人阅读
嵌入式学习(34)
分类:&&3823人阅读&&&
QT中定时器的使用方法
(1)重载timerEvent(QTimerEvent *)函数,然后再在类的构造函数中设置时间间隔
&& startTimer(50);//单位为毫秒
(2)在类的构造函数中设定如下:
&& QTimer *timer=new QTimer(this);
&& connect(timer,SIGNAL(timeout()),this,SLOT(timeoutslot()));//timeoutslot()为自定义槽
&& timer-&start(1000);
QT定时器的两种应用
可以用槽函数实现
(1)重载timerEvent(QTimerEvent *)函数,然后再在类的构造函数中设置时间间隔
startTimer(50);//单位为毫秒
(2)在类的构造函数中设定如下:
QTimer *timer=new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(timeoutslot()));timer-&start(1000);
QTimer *timer=new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(timeoutslot()));//timeoutslot()为自定义槽
timer-&start(1000);
然而:所有Qobject的子类在设置定时器时都不必加载一个Qtimer对象,因为这样造成了资源浪费且需要书写多余的函数,很不方便.最好的办法是重载timerEvent函数,具体写法如下:
class Gui_DlgViewCtrlDatum :
public QDialog
{ Q_OBJECT public:
Gui_DlgViewCtrlDatum( QWidget* parent = 0, const
char* name = 0, bool modal = FALSE, WFlags fl = 0 );
~Gui_DlgViewCtrlDatum(); protected:
void timerEvent( QTimerEvent * );
}; void Gui_DlgViewCtrlDatum::timerEvent( QTimerEvent *e )
class Gui_DlgViewCtrlDatum : public QDialog
Gui_DlgViewCtrlDatum( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
~Gui_DlgViewCtrlDatum();
protected:
void timerEvent( QTimerEvent * );
void Gui_DlgViewCtrlDatum::timerEvent( QTimerEvent *e )
//statements
再在Gui_DlgViewCtrlDatum的构造函数中设置时间间隔:
startTimer(50);//单位为毫秒
这样,每隔50毫秒,函数timerEvent便会被调用一次.
网上又说:
定时器事件的优先级很低,如果需要多个定时器,那么跟踪每一个定时器的ID是很费时的。这种情况下,较好的方法是为每一个定时器创建一个QTimer对象。在每一个时间间隔内,QTimer发出一个timeout()信号。QTimer还支持一次性定时器(只发出一次timeout()信号的定时器)。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:55344次
排名:千里之外
原创:14篇
转载:43篇
(3)(15)(34)(5)}

我要回帖

更多关于 qt 定时器 一次 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信