天天看点

qt定时器的多种使用方式

qt定时器的多种使用方式

      • 1、基础版实现
      • 2、便捷版实现
      • 3、一次性版实现
      • 4、重写定时器事件版实现(QObject内部定时器)

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、便捷版实现

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

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

这种方法最大好处就是省去了定义槽函数。

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

函数(

timerEvent

QObject

类的虚函数),在类的头文件中定义如下:

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的事件
    }
    ...
}
           

继续阅读