【Qt】定时器QTimer操作

Qt定时器操作

Qt的定时器只能通过纯代码实现,定时器顾名思义,主要作用是定时特定的时间。

Qt使用QTimer类实现定时器的功能,需要了解QTImer类的以下几个函数:

  • QTimer::setInterval(timeout):设置定时的时间,单位是ms;
  • QTimer::start():启动定时器;
  • QTimer::timeout():时间到发出信号timeout()

通常使用定时器的步骤是:

  1. 设定定时周期
  2. 绑定timeout()信号到自定义的槽函数
  3. 调用start()还能输启动定时器

使用示例:https://blog.csdn.net/qq_14945437/article/details/99406175。


基于Lambda函数的实现方式

基于Lambda函数的实现方式仅绑定信号槽时不同,如下:

connect(m_timer,&QTimer::timeout,this,[=]()
{
	// 处理定时内容
}
);

一次性实现定时器功能

实现如下,该种方式特定情况下非常适用,比如防止按钮不小心重复点击或双击时,可以在按钮的点击信号槽函数中使用

QTimer::singleSlot(1000,this,[=]{
// 定时器处理
});
ui->pushButton->setEnabled(false);  // 使按钮使能关闭
QTimer::singleSlot(500,this,[=]{
ui->pushButton->setEnabled(true);  // 500ms后使按钮使能开启
});

使用QObject内部定时器,重写定时器事件实现定时器功能

重写定时器事件在需要多个定时器的时候,可以减少系统资源。

实现步骤:

  1. 重写定时器事件函数timerEvent()

    void timerEvent(QTImerEvent *event);  // 重写定时器事件函数
    int m_timerID;  // 定时器ID
    
  2. 启动定时器startTimer()并返回定时器ID

    m_timerID = startTimer(1000);  // 启动定时1s
    
  3. 处理定时器事件

    void classname::timerEvent(QTimerEvent *event)
    {
    	if(m_timerID == event->timerID())  // 判断定时器ID
    	{
    		// 处理ID为m_timerID的定时器事件
    	}
    	else if(m_timerID2 == event->timerID())
    	{
    		// 处理另一个定时器的事件
    	}
    }
    
  4. 在需要时关闭定时器killTimer()

    killTimer(m_timerID);
    

当需要多个定时器时可以参考如下使用:

QList<int> timerIDList;
// ...
for(int i=0;i<100;i++)
	timerIDList.append(startTimer(1000));
// ...

void calssname::timerEvent(QTimerEvent *event)
{
	if(timerIDList.at(0) == event->timerID())
	{
		// 处理当前定时器
	}
	else if(timerIDList.at(0) == event->timerID())
	{
		// 处理当前定时器
	}
	//  ...
}

你可能感兴趣的:(QT,qt,ui,开发语言)