使用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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在一个 for 循环中使用 QTimer 是可能的,但是需要注意一些问题。由于 QTimer 是一个异步定时器,即它会在一个单独的线程中运行,并在定时器超时时发送信号,因此在使用 QTimer 时需要注意一下几点: 1. QTimer 可能会在循环中多次触发,因此需要考虑如何避免重复触发。可以通过设置 QTimer 的单次触发模式来解决这个问题。 2. QTimer 在定时器超时时发送信号,因此需要在一个槽函数中处理定时器超时事件,而不能在循环中直接处理定时器超时事件。 下面是一个使用 QTimer 的 for 循环的示例代码: ```cpp #include <QTimer> #include <QDebug> void MyClass::myMethod() { QTimer timer; timer.setInterval(1000); // 设置定时器间隔为1秒 timer.setSingleShot(true); // 设置单次触发模式 connect(&timer, &QTimer::timeout, this, &MyClass::onTimerTimeout); // 连接定时器超时信号和槽函数 for (int i = 0; i < 10; i++) { qDebug() << i; timer.start(); // 启动定时器 QEventLoop loop; // 创建一个事件循环 loop.exec(); // 进入事件循环,等待定时器超时信号 } } void MyClass::onTimerTimeout() { qDebug() << "Timer timeout"; } ``` 在这个示例代码中,我们创建了一个 QTimer 对象,并设置了定时器间隔和单次触发模式。然后,在 for 循环中,我们启动了定时器,并创建了一个事件循环,等待定时器超时信号的到来。当定时器超时时,会调用 onTimerTimeout() 槽函数,输出一条调试信息。这样,我们就可以在 for 循环中使用 QTimer 了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值