QTimer 不执行槽函数、无法停止计时

本文聚焦于QTimer::SingleShot()的使用问题。阐述了其不执行槽函数的原因,如域内调用不能带域名、必须是SLOT函数、槽函数不能有参数等。还分析了无法停止及循环计时问题,指出SingleShot()无法用stop和killTimer停止,实现循环停止可设标志位但有重复执行风险,若要马上停止循环,可用connect+start。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.QTimer::SingleShot()

不执行槽函数原因

1.域内调用不能带域名。

QTimer::singleShot(5000, this, SLOT(CompareData::slotdownPower()));

2.必须是SLOT函数,普通成员函数无法使用。

3.槽函数不能有参数,因为QTimer的timeout信号是没有参数的。

QTimer::singleShot(5000, this, SLOT(CompareData::slotdownPower(val)));

4.QTimer::singleShot()可以不用声明实例。

无法停止及计时器的循环计时

1.QTimer::SingleShot()是静态成员函数,与实例对象无关,所以stop和killTimer都无法停止。如果靠它实现了循环想要停止,可以设置标志位,满足条件才执行singleShot(),但实际上定时器并没有停止。如果你通过标志位来控制,也存在重复执行的风险,当你多次执行重复含有singleShot()的函数,并设置了标志位停止。当你距离上一次停止的时间不到间隔时间又开始执行,由于此时标志位时可以通过的,上一次停止的和这一次新设置的会重复执行槽函数。

2.如果要实现定时器循环马上停止,还是得用connect+start。可以在槽函数中第一句就析构掉上一个qtimer指针(需要设置一个qtimer指针),然后重新创建qtimer。注意这里killTimer()没用,还是有重复执行的风险,具体原因不知道,可能killTimer()没有析构完全?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值