使用QTimer的一些坑

目录

QT QTimer定时器的暂停,开启和重新启动问题

QT5中QTimer使用时易错之处,以及正确使用方式

使用QTimer的一些坑

----------------------------------------------------------

//注意:slot 函数的不同,它们只是摘录自不同的例子 而已。
//Qt5 写法 1
connect(cTimer, &QTimer::timeout, this, &Thread::timeoutSlot);

==================================

QT QTimer定时器的暂停,开启和重新启动问题

问题:QTimer定时器在工作中执行stop(); 函数后,再start();其结果

回答:

QT在Linux版本中,再次start(), QTimer定时器会保持之前的计时记录,并在之前的样态上继续工作,这一点可以验证。

也就是说,QTimer定时器start();之后,并不会重新计时。。。。

问题:QTimer定时器,若是需要重新启动,该如何处理

回答:

处理的方案一:重新创建定时器

通过函数killTimer(int QTimer_id); 函数把现在停止的QTimer定时器释放掉,然后重新创建定时器,达到重新启动的目的。

QTimer *Ptimer = new QTimer;
int Timer_id = Ptimer->start(1000); /*定时器的id是通过start()函数返回*/

以上是创建部分,下面的代码是QTimer定时器需要释放时的删除函数。

...
killTimer(Timer_id);
...

回答:

处理的方案二:对暂停的定时器,重新填装定时器触发值

通过QTimer::setInterval(msec);函数,对暂停的定时器,重新填装定时器触发值。重新填装的定时器,再通过start()后,QTimer定时器便重新启动计时。

QTimer *Ptimer = new QTimer;
int Timer_id = Ptimer->start(1000); /*定时器的id是通过start()函数返回*/

以上是创建部分,下面的代码是QTimer定时器使用重新填装函数进行重新启动。

...
Ptimer->setInterval(1000);
Ptimer->start();
...

————————————————

版权声明:本文为CSDN博主「求丶空白灬」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_41707123/article/details/116453866

QT5中QTimer使用时易错之处,以及正确使用方式

实际应用中,常常会用到关于延时的功能,或者定时的功能;

     在C++或者C中可以自定义函数。也可以使用自带的Sleep(number)函数,其中number表示需要延时多少ms;

在这里将会向大家介绍一下关于QT5中的定时器类:QTimer 定时器类QTimer提供当定时器触发时发射一个信号的定时器,常用的编程格式如下:

QTimer *timer = new QTimer(this);
timer->start(2000); //该语句不是只运行一次,而是一直运行下去,所以需要一个判断语句来结束
connect(timer, SIGNAL(timeout()), this, SLOT(myTimeout1()));

第一句是在当前this指针指向的界面上定义一个定时器,即:timer指针的父窗口是this指针指向的窗口界面。

第二句的含义是指当timer定时器开始定时,定时的时间长度为2000ms,这句程序还等价于下面这两句程序

timer->setInterval(2000);
timer->start();

它们的作用是一样的。

第三句的意思很明显,就是指当2000ms结束后,会发射一个函数为timeout()信号的信号,该函数经查询作用如下:

void QTimer::timeout()

This signal is emitted when the timer times out.

该timeout()函数会与槽函数timerDone()联系起来,并运行槽函数。

下面重点来了,重要的事情说三遍!重要的事情说三遍!重要的事情说三遍!

注意第二行代码:

timer->start( 2000 ); // 2秒触发定时器

该行代码是每隔2000ms后就会重启定时器,重新调用一次槽函数,除非调用stop()将定时器关掉。例如这样

QTimer *timer = new QTimer();
timer->setInterval(100);//每5秒时间用尽之后运行一次connect()函数;
timer->start(); //该语句不是只运行一次,而是一直运行下去,所以需要一个判断语句来结束
connect(timer, SIGNAL(timeout()), this, SLOT(myTimeout1()));
if(number>118)
{
number=0;
timer->stop();
}

这里定义了一个全局变量number,此处目的是让定时器运行118次,在第119次以后不再使用定时功能。

void :myTimeout1()
{
number++;
QString str1;
//将变量设置为全局变量、数组
if(number<110)
{
str1=QString("%1").arg(data1[number][0]);
ui->tableWidget_3->setItem(0,0,new QTableWidgetItem(str1));
}
}

data1[ ][ ]是定义的一个全局数组。

————————————————

版权声明:本文为CSDN博主「gy1012」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/czy47/article/details/81004131

使用QTimer的一些坑

1、给timeout()添加槽函数

添加槽函数时需要显式连接,这时不能将函数名命名为on_控件名_信号,否则就会报错No matching signal for,因为i这是隐式连接的函数命名方式。

connect(fTimer, SIGNAL(timeout()), this, SLOT(onTimerTimeout()));

————————————————

版权声明:本文为CSDN博主「Dreamer.L」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/FOUREYESPIG/article/details/106862030

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值