zoukankan      html  css  js  c++  java
  • _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();//停止运行
            }
        }
    }

     

    从〇开始,回到〇
  • 相关阅读:
    学习C#的一些笔记
    SQL高级应用
    SQL SERVER 视图
    ES5 Study
    面试官技巧
    WebServicexml操作
    用JS和HTML写自己的文本编辑器
    解决Win7 x64 VS2010调试网站出现 vs2010 未能将脚本调试器附加到计算机上的进程。已附加了一个调试器
    Microsoft.Practices.Unity实现代码依赖注入、XML依赖注入和AOP切面编程
    无法对数据库'XXX' 执行删除,因为它正用于复制"的解决方法
  • 原文地址:https://www.cnblogs.com/zpsoe/p/7080697.html
Copyright © 2011-2022 走看看