qt定时器的多种使用方式

1、基础版实现

(1)头文件类中定义Timer *mTime; 指针变量或直接定义QTimer 定时器变量,如下:

QTimer mTime;

(2)绑定信号槽

connect(&mTime,&QTimer::timeout,this,&Mainwindow::slotTime);
//或
connect(&mTime,SIGNAL(timeout()),this,SLOT(slotTime()));

这里依据官方说法,好像建议使用上着方法。

(3)启动 / 停止 定时器

    mTime.start(m_nSpeed); 
    mTime.stop();

2、便捷版实现(基于Lambda函数)

Lambda函数介绍: https://blog.csdn.net/weixin_42887343/article/details/122099296

这种实现和1种无差别,只是信号槽绑定有所不同,实现如下:

	QTimer *mTime = new QTime();
    connect(mTime,&QTimer::timeout,this,[=]() 
    {
        //update();	//定时处理内容
    });
    mTime.start(m_nSpeed);  

使用Lambda函数方式,这种方法最大好处就是省去了声明槽函数。

3、一次性版实现

从名字来看就是只处理一次,实现如下:

    QTimer::singleShot(1000,this,[=]{
        //update();	//定时处理内容
    });

这种方法比较特殊,特定情况下非常适用。
举个例子: 为了防止按钮不小心重复点击或双击,在按钮的点击槽中添加如下代码可完美实现该需求。

void MainWindow::on_pushButton_2_clicked()
{
    ui->pushButton_2->setEnabled(0);		//失能按钮,此时不可点
    QTimer::singleShot(500,this,[=]{
        ui->pushButton_2->setEnabled(1);	//500ms后使能按钮,此时可点
    });
    //按钮点击处理函数
}

4、重写定时器事件版实现(QObject内部定时器)

(1)重写timerEvent函数(timerEventQObject类的虚函数),在类的头文件中定义如下:

    void timerEvent(QTimerEvent *event);    //定时器事件
	int  m_timerId;       //定义一个定时器ID

(2)启动定时器并返回定时器ID,一般在初始化函数(或构造函数)中实现,如下:

   	m_timerId = startTimer(1000);	//参数为定时时间
	killTimer(m_timerId);	//在需要时关闭定时器

(3)处理定时器事件

void RadarWidgit::timerEvent(QTimerEvent *event)
{
    if(m_timerId == event->timerId())	//判断定时器ID
    {
        //处理m_timerId定时器事件
    }
//    else if(m_timerId == event->timerId())
//    {
    	//处理定时器2的事件
//    }
}

这种方法最大的好处就是,在需要许多个定时器的时候,可以减少系统资源,不过我们一般很少用这种方法,所以也比较少见。
使用该方法创建多个定时器的实现:

QList<int>  timerIdList;	//定时器ID链表
for(int i = 0;i < 100;i ++)			//创建100个定时器
	timerIdList.append(startTimer(1000));
void RadarWidgit::timerEvent(QTimerEvent *event)
{
    if(timerIdList.at(0) == event->timerId())	//判断定时器ID
    {
        //处理定时器1的事件
    }
    else if(timerIdList.at(1) == event->timerId())
    {
    	//处理定时器2的事件
    }
    ...
}
  • 17
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值