【Qt】定时器处理——定时器事件类QTimerEvent和定时器类QTimer使用


Qt定时器处理

Qt的定时器只能通过纯代码实现,定时器顾名思义,主要作用是定时特定的时间。
Qt提供了定时器事件类QQTimerEvent和定时器类QTimer实现定时器操作。

定时器QTimer使用

Qt提供了更高层次的定时器编程接口**QTimer**类,可以使用信号和槽,还可以设置定时一次。比较常用的方法有:

  • QTimer::setInterval(timeout):设置定时的时间,单位是ms;
  • QTimer::start():启动定时器;
  • QTimer::timeout():时间到发出信号timeout()
  • QTimer::singleShot():只运行一次的定时器;
  • QTimer::stop():停止定时器

QTimer实现定时器功能大致步骤:

  • 创建定时器对象,QTimer *timer = new QTimer(this);
  • 将定时器的超时信号与自定义的时间更新槽函数连接,也可以使用lambda表达式connect(timer,&QTimer::timeout,this,&MyLCDNumber::timerUpdate);
  • 设置溢出时间,timer->setInterval(1000);
  • 定时器开始定时,timer->start();
  • 需要停止定时器调用timer->stop()即可。
  • 具体代码可参考如下:
MyLCDNumber::MyLCDNumber(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyLCDNumber)
{
    ui->setupUi(this);
    QTimer *timer = new QTimer(this);
    // 关联定时器的超时信号都自定义槽函数中
    connect(timer,&QTimer::timeout,this,&MyLCDNumber::timerUpdate);
    timer->setInterval(1000);
    timer->start(); 
}
void MyLCDNumber::timerUpdate()
{
    QTime time = QTime::currentTime();
    QString text = time.toString("hh:mm:ss");
    if(time.second() %2 ==0 )  // second()获取秒的值
    {
        text[5] = ' ';  // 每隔1s将:显示为空格
    }
    ui->lcdNumber->display(text);
}

基于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内部定时器事件类QTImerEvent,重写定时器事件实现定时器功能

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

  • QObject的子类可以使用startTimer()可以开启一个定时器,该函数参数单位是毫秒,表示设定的时间,函数返回值表示这个定时器。当定时器到达指定的时间时会进入timerEvent()函数进行需要的操作。
  • 通过函数timerId()可以获取startTimer()返回的定时器。
  • 如果想要停止定时器调用killTimer()即可。

实现步骤:

  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);
    

总结使用QTImerEven实现定时器的操作的步骤:

  1. 使用startTImer()开启一个定时器;
  2. 重写timerEvent()函数;
  3. 需要关闭定时器时调用killTimer()

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

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())
	{
		// 处理当前定时器
	}
	//  ...
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值