目录
singleShot
timerEvent
QTimer类定时器 的创建和使用步骤
-------------------------------------------
//注意:slot 函数的不同,它们只是摘录自不同的例子 而已。
//Qt5 写法 1
connect(cTimer, &QTimer::timeout, this, &Thread::timeoutSlot);
=============================
Qt实战案例(59)——利用QTimer类实现定时器功能(**)
使用QTimer类定时器的步骤:
=============================
Qt的三种定时器的使用
1、singleShot
原型:
void QTimer::singleShot(int msec, const QObject *receiver, const char *member)
解释:这个静态函数在一个给定时间间隔 msec(毫秒) 之后调用一个槽。
用法1 :
假设类A有个槽函数 function() { }
我们要在1s之后执行它
QTimer::singleShot(1000,this, &A::function());
用法2:
实现循环
槽函数中还是singleShot 即:
//这样的话就是一个每1秒执行一次的定时器
bool condition = true;
function(){
if(condition){ //条件控制
QTimer::singleShot(1000,this, &A::function());
}
}
//这样的话就是一个每1秒执行一次的定时器
bool condition = true;
function()
{
if(condition){ //条件控制: 退出/终止 单次定时器 的运行
QTimer::singleShot(1000,this, &A:: function());
}
}
2、timerEvent
函数原型:
[virtual protected] void QObject::timerEvent(QTimerEvent *event)
解释:QObject提供的定时器通过
startTimer(int interval)
启动,该函数启动了一个时间间隔为interval毫秒的定时器,启动成功只返回一个定时器标志符,失败返回0,
因为只返回一个标志符,所以无法获得该定时器的对象,它是QObject的成员函数,及不能正常的使用信号与槽,只能通过重载定时器事件处理函数timerEvent,在里面写定时器触发要做的事。
如果有多个定时器,可以通过
QTimerEvent::timerId()
来获取已经启动的定时器标识符。
该定时器只能通过
killTimer(int id)
杀死,参数id为之前生成定时器标志符,根据标志符杀死定时器。
void QObject::killTimer(int id);
每一个定时器做的事情可能不一样,但是定时器处理函数只有一个,我们可以通过if判断来让某个定时器干某件事
class MyObject : public QObject
{
Q_OBJECT
public:
MyObject(QObject *parent = 0);
protected:
//重写定时器事件
void timerEvent(QTimerEvent *event);
private:
//声明定时器ID
int timeID;
};
MyObject::MyObject(QObject *parent)
: QObject(parent)
{
timeID = startTimer(1000); // 1-second timer
}
void MyObject::timerEvent(QTimerEvent *event)
{
qDebug() << "Timer ID:" << event->timerId();
if(event->timerId() == timeID)
{
//todo function
if(timeID)
{
killTimer(timeID);// 杀死定时器
}
timeID = 0;
}
}
3、QTimer类定时器
使用QTimer类定时器的步骤:
(1)先创建一个QTimer定时器实例:
QTimer *timer = new QTimer(this);
(2)然后连接超时信号与槽:
connect(timer, SIGNAL(timeout()), this, SLOT(Func()));
(3)设置定时器触发间隔(设置触发间隔有两个方法,
一个是调用
setInterval(int msec)
设置,
另一个是调用
start(int msec); // timer->start(int msec)
时可将间隔时间作为参数):
void setInterval(int msec) ;,
(4)在需要的地方启动定时器:
start(),
或者设间隔时间,可通过
start(1000),
即启动一个1000毫秒的定时器
(5)用完了暂停定时器:
stop();
(6)删除定时器实例:
delete timer;
参考链接:https://blog.csdn.net/ddllrrbb/article/details/88810767
https://blog.csdn.net/kidults/article/details/80091788
====================
Qt实战案例(59)——利用QTimer类实现定时器功能(**)
目录
一、项目介绍
二、项目基本配置
三、UI界面设置
四、主程序实现
4.1 widget.h头文件
4.2 widget.cpp源文件
五、效果演示
一、项目介绍
本文介绍利用QTimer类实现定时器的定时功能。
QTimer还提供了一个简单的只有一次定时的函数singleShot()。一个定时器在100ms后触发处理函数animateTimeout()并且只触发一次。代码如下:
QTimer::singleShot( 100,this, SLOT(animateTimeout()) );
二、项目基本配置
新建一个Qt案例,项目名称为“TimeTest”,基类选择“QWidget”,取消选中创建UI界面复选框,完成项目创建。
三、UI界面设置
UI界面如下:
无UI界面
四、主程序实现
4.1 widget.h头文件
声明公共变量和私有槽函数:
public:
QTimer *testTimer;
int i=1;
private slots:
void testFunction();
4.2 widget.cpp源文件
在构造函数中创建定时器,并将定时器超时信号和槽联系起来,并且开始运行定时器:
//创建定时器
testTimer = new QTimer(this);
//将定时器超时信号与槽(功能函数)联系起来
connect( testTimer,SIGNAL(timeout()), this, SLOT(testFunction()) );
//开始运行定时器,定时时间间隔为1000ms
testTimer->start(1000);
在析构函数中停止运行定时器:
//停止运行定时器
if (testTimer->isActive() )
testTimer->stop();
定义槽函数:
void Widget::testFunction()
{
qDebug("timer event %d",i++);
}
五、效果演示
完整效果如下:
如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/86587478
————————————————
版权声明:本文为CSDN博主「wendy_ya」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/didi_ya/article/details/126961766