当前位置: 首页>編程日記>正文

Qt定时器QTimer使用教程与代码演示

Qt定时器QTimer使用教程与代码演示

Qt提供了定时器类QTimer, 在使用时需要包含头文件

#include <QTimer>

QTimer类方法介绍:

  • void start(int msec); 开启定时器,定时间隔的msec毫秒
  • void stop(); 结束定时

QTimer信号:

  • void timeout(QPrivateSignal); 在链接定时器时,需要绑定该信号

QTimer的基本使用

下面介绍如何使用Qt定时器实现一个秒表。
新建一个Qt MainWindow项目,界面如下:
在这里插入图片描述
时间的显示用的LCD控件 QLCDNumber

运行效果
在这里插入图片描述

MainWindow 头文件代码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTimer>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_btnStart_clicked();void on_btnStop_clicked();void on_btnContinue_clicked();void on_timer();private:Ui::MainWindow *ui;QTimer *m_pTimer;int     m_counts = 0;   //时间计数
};
#endif // MAINWINDOW_H

在头文件定义了定时器对象指针m_pTimer,毫秒计数m_counts

MainWindow cpp代码

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//LCD控件,需要先设置显示的数字个数,再显示数字,不然显示不全ui->lcdNumber->setDigitCount(9);ui->lcdNumber->display("00:00:000");//new QTimer, 设置定时器类型m_pTimer = new QTimer(this);m_pTimer->setTimerType(Qt::PreciseTimer);//链接定时器信号timeout,当调用start时,触发槽函数on_timerconnect(m_pTimer, &QTimer::timeout, this, &MainWindow::on_timer);
}MainWindow::~MainWindow()
{delete ui;
}//开始计时
void MainWindow::on_btnStart_clicked()
{m_pTimer->start(1);   //开启定时器,频率为1msm_counts = 0;
}//暂停计时
void MainWindow::on_btnStop_clicked()
{m_pTimer->stop();
}//继续计时
void MainWindow::on_btnContinue_clicked()
{m_pTimer->start(1);
}void MainWindow::on_timer()
{m_counts++;char buf[64];if(m_counts < 1000)  //1秒以内{sprintf(buf, "00:00:%03d", m_counts);}else if(m_counts > 1000 && m_counts < 60 * 1000) //一分钟以内{int seconds = m_counts / 1000;int ms = m_counts - seconds * 1000;sprintf(buf, "00:%02d:%03d", seconds, ms);}else{int mins = m_counts / (60 * 1000);int seconds = (m_counts - mins * 60 * 1000) / 1000;int ms = m_counts - mins * 60 * 1000 - seconds * 1000;sprintf(buf, "%02d:%02d:%03d", mins, seconds, ms);}ui->lcdNumber->display(buf);
}

需要注意的是,QTimer可以设置类型,也就是调用setTimerType进行设置,QTimer声明的定时器类型如下:

enum TimerType {PreciseTimer,CoarseTimer,VeryCoarseTimer};

这三种什么意思呢,Qt助手的解释如下:

  • Qt::PreciseTimer 精确的计时器试图保持毫秒的精确度
  • Qt::CoarseTimer 粗计时器试图将精度保持在所需间隔的5%以内
  • Qt::VeryCoarseTimer 非常粗糙的计时器只能保持完全的秒精度

在new QTimer时,可以根据需求设置定时器精度。

在UNIX(包括Linux, macOS和iOS)上,Qt将保持毫秒精度的Qt::PreciseTimer。对于Qt::CoarseTimer,间隔将被调整至5%,以使计时器与其他预期在或大约在同一时间触发的计时器对齐。目标是让大多数计时器在同一时间唤醒,从而减少CPU唤醒和功耗。

在Windows上,Qt将使用Windows的多媒体定时器工具(如果可用)用于Qt::PreciseTimer和普通的Windows定时器用于Qt::CoarseTimer和Qt::VeryCoarseTimer。

在所有平台上,Qt::VeryCoarseTimer的间隔被舍入到最近的满秒(例如,23500ms的间隔将被舍入到24000ms, 20300ms将被舍入到20000ms)。

QTimer::singleShot使用说明

QTimer除了周期性的执行某种操作,还可以单次执行,QTimer的静态函数singleShot就是为了实现这种单次操作功能,singleShot在一个给定时间间隔 msec(毫秒) 之后调用一个槽,例如下面的代码:

void MainWindow::on_pushButton_clicked()
{QTimer::singleShot(3000,this,[=]{//想要执行的代码qDebug() << "hello world" ;});
}

在3000ms后,将打印hello world, 上面是用的lambdab函数,也可以用类成员函数来写,代码如下:
头文件,在头文件定义成员函数do_single,给QTimer::singleShot做槽函数

class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();//定义成员函数,给QTimer::singleShot做槽函数void do_single();private slots:void on_pushButton_clicked();private:Ui::MainWindow *ui;
};

cpp文件

void MainWindow::on_pushButton_clicked()
{
//    QTimer::singleShot(3000,this,[=]{
//        //想要执行的代码
//        qDebug() << "hello world" ;
//    });QTimer::singleShot(3000, this, &MainWindow::do_single);
}void MainWindow::do_single()
{qDebug() << "hello world" ;
}

注意singleShot它只会触发一次,发出一次信号,然后来执行槽函数。


https://www.fengoutiyan.com/post/13386.html

相关文章:

  • 定时器的种类
  • js定时器原理
  • 定时器计算
  • 定时器代码
  • 电子定时器怎么设置
  • 定时器
  • 代码
  • 定时器0
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機