您当前的位置: 首页 >  qt

令狐掌门

暂无认证

  • 5浏览

    0关注

    513博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

令狐掌门 发布时间:2021-11-20 17:42:59 ,浏览量:5

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

#include 

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 
#include 

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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_timer
    connect(m_pTimer, &QTimer::timeout, this, &MainWindow::on_timer);
}

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

//开始计时
void MainWindow::on_btnStart_clicked()
{
    m_pTimer->start(1);   //开启定时器,频率为1ms
    m_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 && m_counts 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()             
关注
打赏
1652240117
查看更多评论
0.0442s