_ZNote_Qt_定时器的总结

Qt中实现定时器有两种方法.

一种是使用QObject类定时器;一种是使用QTimer类定时器.(定时器的精度依赖于操作系统和硬件,大多数平台支持20ms)

1,QObject类定时器.

通过QObject::startTimer(),可以把一个一毫秒为单位的时间间隔作为参数来开始定时器,这个函数返回一个唯一的整数定时器的标识符。这个定时器开始就会在每一个时间间隔"触发",直到明确的使用这个定时器的标识符来调用QObject::killTimer()结束。 当定时器触发时,应用程序会发送一个QTimerEvent。在事件循环中,处理器按照事件队列的顺序来处理定时器事件。当处理器正忙于其它事件处理时,定时器就不能立即处理。

 

int QObject::startTimer(int interval);
//开始一个定时器并返回定时器ID,如果不能开始一个定时器,将返回0。
//定时器开始后,每隔interval毫秒间隔将触发一次超时事件,直到killTimer()被调用来删除定时器。
//如果interval为0,那么定时器事件每次发生时没有窗口系统事件处理。

 

 

 

virtual void QObject::timerEvent(QTimerEvent *event);
// 虚函数timerEvent()被重载来实现用户的超时事件处理函数。
// 如果有多个定时器在运行,QTimerEvent::timerId()被用来查找指定定时器,对其进行操作。
// 当定时器事件发生时,虚函数timerEvent()随着QTimerEvent事件参数类一起被调用,重载这个函数可以获得定时器事件。

 

 

 

void killTimer(int id);
//通过定时器标识符来杀死定时器。

 

 

实例:

//  .h 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    void timerEvent(QTimerEvent *t);
    Ui::MainWindow *ui;
    int m_nTimerId1;
    int m_nTimerId2;
    int m_nTimerId3;
};

#endif // MAINWINDOW_H


/ .cpp ///

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtCore>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_nTimerId1 =  startTimer(1000);
    m_nTimerId2 =  startTimer(5000);
    m_nTimerId3 =  startTimer(10000);

 //有教程说直接按照顺序,几个定时器,就返回几.但实际上并不一定这样.
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::timerEvent(QTimerEvent *t)//定时器时间
{

       int id = t->timerId();
       qDebug() <<id;
    if(id == m_nTimerId1) ui->label->setText(tr("每秒产生一个随机数:%1").arg(qrand()%10));
    if(id == m_nTimerId2) ui->label_2->setText(tr("5秒后软件将关闭"));
    if(id == m_nTimerId3) qApp->quit();
    
    /*
    switch(t->timerId())//判断定时器的句柄
       {
               //qrand(),可以产生随机数
               //qrand()%10可以产生0~9之间的随机数
               //要想产生100以内的随机数就得%100
              case 2:ui->label->setText(tr("每秒产生一个随机数:%1").arg(qrand()%10));break;
              case 3:ui->label_2->setText(tr("5秒后软件将关闭"));break;
              case 4:qApp->quit();break;//退出系统
       }
       */
}

void MainWindow::on_pushButton_clicked()
{
    if(m_nTimerId1 != 0)
    killTimer(m_nTimerId1);
    
    if(m_nTimerId2 != 0)
    killTimer(m_nTimerId2);
    
    if(m_nTimerId2 != 0)
    killTimer(m_nTimerId2);
}

 实现效果:

2,QTimer类实现

QTimer类定时器是QObject类定时器的扩展版或者说升级版,因为它可以提供更多的功能。比如说,它支持单次触发和多次触发。

使用QTimer类定时器的步骤:

(1)创建一个QTimer定时器实例:QTimer *timer = new QTimer(this);
(2)连接超时信号与槽:connect(timer, SIGNAL(timeout()), this, SLOT(testFunc()));
(3)启动定时器start(); 定时器有两种  start(int time)  和  setSingleShot(true)  前者表示重复触发,除非stop关闭. 后者仅仅启动一次.
(4)适时关闭定时器:stop();
(5)删除定时器实例:delete timer;

 

例如:

 

/////  .h  //
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtCore>
#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

  private slots:
    void timerUpdate();
private:
    QTimer *timer;
    int timerInt;
};

#endif // MAINWINDOW_H



///  .cpp   /

#include "mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    timer = new QTimer(this); //新建定时器

    connect(timer,SIGNAL(timeout()),this,SLOT(timerUpdate()));//关联定时器计满信号和相应槽函数
    timer -> start(1000);//定时器开始,1000ms触发一次
    timerInt = 0;
}

MainWindow::~MainWindow()
{

}

void MainWindow::timerUpdate()
{

    QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间
    QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd");//设置系统时间显示格式
  //  ui->label->setText(str);//在标签上显示时间
    qDebug() << str;

    if(timerInt++ == 5){
        if(timer ->isActive()){
            timer -> stop();//停止运行
        }
    }
}

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/zpsoe/p/7080697.html

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值