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();//停止运行
            }
        }
    }

     

    从〇开始,回到〇
  • 相关阅读:
    (BFS 二叉树) leetcode 515. Find Largest Value in Each Tree Row
    (二叉树 BFS) leetcode513. Find Bottom Left Tree Value
    (二叉树 BFS DFS) leetcode 104. Maximum Depth of Binary Tree
    (二叉树 BFS DFS) leetcode 111. Minimum Depth of Binary Tree
    (BFS) leetcode 690. Employee Importance
    (BFS/DFS) leetcode 200. Number of Islands
    (最长回文子串 线性DP) 51nod 1088 最长回文子串
    (链表 importance) leetcode 2. Add Two Numbers
    (链表 set) leetcode 817. Linked List Components
    (链表 双指针) leetcode 142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/zpsoe/p/7080697.html
Copyright © 2011-2022 走看看