Qt之定时器

2023-05-16

文章目录

  • QObject类的定时器
  • 定时器类QTimer

  Qt使用定时器有两种方法,一种是使用QObiect类的定时器,一种是使用QTimer类。定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度。

QObject类的定时器

  QObject是所有Qt对象的基类,它提供了一个基本的定时器。通过QObject::startTimer,可以把一个一毫秒为单位的时间间隔作为参数来开始定时器,这个函数返回一个唯一的整数定时器的标识符。这个定时器开始就会在每一个时间间隔触发,直到明确地使用这个定时器的标识符来调用QObject::killTimer结束。当定时器触发时,应用程序会发送一个QTimerEvent。在事件循环中,处理器按照事件队列的顺序来处理定时器事件。当处理器正忙于其它事件处理时,定时器就不能立即处理。
  QObject类还提供定时期的功能。与定时器相关的成员函数有startTimertimeEventkillTimerstartTimer原型如下:

intQObject::startTimer ( int interval );

开始一个定时器并返回定时器ID,如果不能开始一个定时器,将返回0。定时器开始后,每隔interval毫秒间隔将触发一次超时事件,直到killTimer被调用来删除定时器。如果interval0,那么定时器事件每次发生时没有窗口系统事件处理。
  虚函数timerEvent被重载来实现用户的超时事件处理函数。如果有多个定时器在运行,QTimerEvent::timerId被用来查找指定定时器,对其进行操作。当定时器事件发生时,虚函数timerEvent随着QTimerEvent事件参数类一起被调用,重载这个函数可以获得定时器事件。定时器的用法如下:

/* 头文件 */
class QNewObject : publicQObject {
    Q_OBJECT
public:
    QNewObject ( QObject *parent = 0 );
    virtual ~QNewObject();
protected:
    void timerEvent ( QTimerEvent *event );
    int m_nTimerId;
};

/* 源文件 */
QNewObject::QNewObject ( QObject *parent ) : QNewObject ( parent ) {
    m_nTimerId = startTimer ( 1000 );
}

QNewObject::~QNewObject() {
    if ( m_nTimerId != 0 ) {
        killTimer ( m_nTimerId );
    }
}

voidQNewObject::timerEvent ( QTimerEvent *event ) {
    qDebug ( "timer event, id %d", event->timerId() );
}

定时器类QTimer

  定时器类QTimer提供当定时器触发的时候发射一个信号的定时器,它提供只触发一次的超时事件,通常的使用方法如下:

QTimer *testTimer = newQTimer ( this ); /* 创建定时器 */
/* 将定时器超时信号与槽(功能函数)联系起来 */
connect ( testTimer, SIGNAL ( timeout() ), this, SLOT ( testFunction() ) );
testTimer->start ( 1000 ); /* 开始运行定时器,定时时间间隔为1000ms */

if ( testTimer->isActive() ) { /* 停止运行定时器 */
    testTimer->stop();
}

QTimer还提供了一个简单的只有一次定时的函数singleShot。 一个定时器在100ms后触发处理函数animateTimeout并且只触发一次。代码如下:

QTimer::singleShot ( 100, this, SLOT ( animateTimeout() ) );

  widget.h如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
    class Widget;
}

class Widget : public QWidget {
    Q_OBJECT
public:
    explicit Widget ( QWidget *parent = 0 );
    ~Widget();
protected:
    void timerEvent ( QTimerEvent *event );
private slots:
    void timerUpdate();
private:
    Ui::Widget *ui;
    int id1, id2, id3;
};

#endif // WIDGET_H

  widget.cpp如下:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QTimer>
#include <QTime>

Widget::Widget ( QWidget *parent ) : QWidget ( parent ), ui ( new Ui::Widget ) {
    ui->setupUi ( this );
    /* 开启一个1秒定时器,返回其ID */
    id1 = startTimer ( 1000 );
    id2 = startTimer ( 2000 );
    id3 = startTimer ( 3000 );
    QTimer *timer = new QTimer ( this ); /* 创建一个新的定时器 */
    /* 关联定时器的溢出信号到我们的槽函数上 */
    connect ( timer, SIGNAL ( timeout() ), this, SLOT ( timerUpdate() ) );
    timer->start ( 1000 ); /* 设置溢出时间为1秒,并启动定时器 */
    /* 为随机数设置初值 */
    qsrand ( QTime ( 0, 0, 0 ).secsTo ( QTime::currentTime() ) );
    /* singleShot函数用来开启一个只运行一次的定时器。该代码的作用是让程序运行10秒后自动关闭。*/
    QTimer::singleShot ( 10000, this, SLOT ( close() ) );
}

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

void Widget::timerEvent ( QTimerEvent *event ) {
    /* 判断是哪个定时器 */
    if ( event->timerId() == id1 ) {
        qDebug() << "timer1";
    } else if ( event->timerId() == id2 ) {
        qDebug() << "timer2";
    } else {
        qDebug() << "timer3";
    }
}

void Widget::timerUpdate() { /* 定时器溢出处理 */
    QTime time = QTime::currentTime(); /* 获取当前时间 */
    QString text = time.toString ( "hh:mm" ); /* 转换为字符串 */

    /* 注意单引号间要输入一个空格。每隔一秒就将“:”显示为空格 */
    if ( ( time.second() % 2 ) == 0 ) {
        text[2] = ' ';
    }

    ui->lcdNumber->display ( text );
    int rand = qrand() % 300; /* 产生300以内的正整数 */
    ui->lcdNumber->move ( rand, rand );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt之定时器 的相关文章

  • Run dronekit scripts by SITL on Linux 执行dronekit 脚本在Linux系统下模拟飞行

    参考 xff1a http ardupilot org dev docs setting up sitl on linux html Overview The SITL simulator allows you to run Plane C
  • SLAM从入门到放肆——SLAM简述

    SLAM 同时定位与建图 xff08 simultaneous localization and mapping xff0c SLAM xff09 是自动驾驶与增强现实领域中常用的技术 主要研究装置通过各种传感器在未知环境中的感知与定位问题
  • 关于NoDriveTypeAutoRun的键值

    最近在写一个修改注册表的驱动 xff0c 只是为了好玩 xff0c 也算是一个恶搞驱动吧 xff01 遇到一个问题 xff0c 花了我差不多两天的时间的 xff0c 详情往下看 写这篇文章 xff0c 为了记住这个教训 xff0c 一个提供
  • 闭包的实现原理和作用、以及内存泄露

    一 闭包的实现原理和作用 xff0c 可以列举几个开发中闭包的实际应用 1 闭包的概念 xff1a 指有权访问另一个函数作用域中的变量的函数 xff0c 一般情况就是在一个函数中包含另一个函数 2 闭包的作用 xff1a 访问函数内部变量
  • PX4 SITL Gazebo 仿真时 libgazebo_multirotor_base_plugin 插件运行时出错

    PX4 SITL Gazebo 仿真时 libgazebo multirotor base plugin 插件运行时出错 问题描述原因分析解决办法总结 问题描述 在 Gazebo 中进行 PX4 的软件在环仿真时 xff0c 执 make
  • Jetson AGX Xavier 正确上手教程

    概览 1 开机1 1 配件1 2 需要准备的器材1 3 连接设备 2 刷机2 1 更换主机的 apt get 源2 2 在主机上安装 SDK ManagerStep 1Step xff12 Step xff13 烧录 OS 镜像安装 SDK
  • Matplotlib绘图显示缺少中文字体-RuntimeWarning: Glyph 8722 missing from current font.

    pyplot 并不默认支持中文显示 xff0c 也没有自带中文字体 xff0c 因此需要自行下载所需字体 xff0c 并修改 rcParams 参数来显示中文 下面以 SimHei xff08 黑体 xff09 字体为例进行说明 说明 xf
  • Win10 系统安装 Linux 子系统教程(WSL2 + Ubuntu 20.04 + Gnome 桌面 )

    Win10 系统安装 Linux 子系统教程 WSL2 43 Ubuntu 20 04 43 Gnome 桌面 xff09 1 WSL 简介1 1 什么是 WSL xff1f 1 2 WSL1 与 WSL2 2 安装 WSL2 1 安装 W
  • Ubuntu 桌面美化教程

    将 Ubuntu 桌面美化成 Mac 风格 xff0c 效果如下 1 美化任务栏 Ubuntu 20 04 默认的任务栏在桌面左侧 xff0c 不使用时会自动隐藏 安装 plank dock 工具可以在桌面底部设置一个常驻任务栏 xff08
  • Git 图解教程

    Git 图解教程 基础篇 git 简介 安装与配置 安装 git 配置 git 创建版本库 跟踪修改 提交修改 比较文件 辅助命令 创建分支 合并分支 git merge git rebase 高级篇 移动提交记录 分离的 HEAD 相对引
  • Doxygen + Graphviz 代码自动化分析

    Doxygen 43 Graphviz 代码自动化分析 目录 1 实际需求2 工具简介3 使用说明4 代码注释规范5 参考 1 实际需求 在开发程序时 xff0c 需要编写对应的说明文档 在阅读现有的项目源代码时 xff0c 需要梳理函数间
  • Microsoft Learn: Docker入门教程

    Microsoft Learn Docker入门教程 1 Introduction2 What is Docker3 How Docker images work4 How Docker containers work5 When to u
  • 将kitti数据集中的velodyne points转换为ROS bag文件

    kitti数据集中包含了相机图像 激光扫描得到的点云信息 高精度GPS测量信息和IMU加速度信息 xff0c 用于移动机器人与自动驾驶方面的研究 如下为数据采集平台示意图 kitti数据集中的激光扫描数据是以二进制文件形式存储的 xff0c
  • 使用 Dockerfile 创建一个简单的容器

    Dockerfile Dockerfile 是用于指导 docker 创建自定义 image 的一系列指令 xff0c 是用于创建 image 的蓝图 现在有一个简单的 node 项目 其中Dockerfile 是后面加的 xff0c 初始
  • 导航英语专业词汇——不停更新

    惯性导航 inertia 惯性INS 惯性导航系统GINS 平台惯性导航系统SINS 捷联惯性导航系统IMU 惯性导航元件gyroscope 陀螺仪accelerometer 加速度计 SLAM 词汇词性意思 导航中用 SLAM词组同步定位
  • 不止于linux SSH 基本用法-正反向代理-内外网穿透

    最近小伙伴们纷纷进了实验室 xff0c 就冒出了一系列关于控制远程机器的问题 xff0c 我觉得我还是有必要科普一下的 约定 本文不讲解 Linux 使用方法 xff0c 只讲解机器之间的通信方法 下文中行首的 local 以及 remot

随机推荐

  • 传感器数据滤波算法

    嵌入式应用中 xff0c 系统获取的传感器数据通常不能够直接供应用使用 xff08 存在噪声干扰 xff1a 低频噪声或高频噪声 xff09 xff0c 一般通过一种或者多种滤波算法结合 xff0c 对原始数据进行滤波处理 xff0c 在保
  • 写了一个生成reStructuredText表格的vim插件

    vim官网上有一个rst table xff0c 不过不太好用 xff0c 最大的问题是对中文的支持有欠缺在 f后 xff0c 中文所在的cell的长度会计算错误 扫了一眼它的源码使用了python写的插件 xff0c 所以我就心血来潮也想
  • Ubuntu 16.04 一系列软件安装命令,包括QQ、搜狗、Chrome、vlc、网易云音乐安装方法

    1 简介 Ubuntu 16 04安装完后 还需要做一些配置才能愉快的使用 包括添加软件源 安装搜狗输入法 Chrome浏览器 网易云音乐 配置快捷键 安装git等等 下面就跟着我来配置吧 just do it 2 版本选择 如果你是小白
  • 从入门到放弃之生产环境基于Kubernetes V1.21.10搭建高可用集群

    1 资源规划 名称系统配置IP组件k8s master01CentOS 7 94核8G 500G存储172 16 97 27kube apiserver lt br gt kube controller manager lt br gt k
  • ros c++ 开发错误“集锦”

    集锦 xff0c 才能经常回放 1 error s getMD5Sum is not a member2 ROS datatype md5sum错误 持续更新 1 error s getMD5Sum is not a member 目前观测
  • 嵌入式ARM算法移植与优化

    目录 一 算法优化指导思想 1 算法优化基本原则 2 算法优化方法 二 编译器优化 1 xff0c 函数内联 2 xff0c 消除公共子表达式 3 xff0c 循环展开 4 xff0c GCC优化选项 5 xff0c ARMCC优化选项 三
  • OV2640摄像头驱动与应用代码

    目录 一 摄像头基础 1 1 OV2640参数 1 2 视场角与镜头 二 OV2640驱动 三 OV2640视频接入
  • ubuntu16.04常用软件安装

    目录 1 办公软件 xff1a WPS 2 文本比较工具 Meld 3 版本管理 xff1a git 4 安装wine 5 安装常用库 6 配置阿里源 7 vim 8 OpenCV 9 QT 10 VSCode 11 gparted 1 办
  • RK1109 NPU算法测试demo

    目录 一 矩阵乘法测试 二 测试结果 一 矩阵乘法测试 通过一个简单的矩阵乘法 xff0c 和L2距离计算来测试NPU计算性能与启动NPU的一般方法 具体代码如下 xff1a Example Calculate x y 2 using Ma
  • VS2015远程连接虚拟机

    目录 一 安装VC Linux exe 二 打开VS 选择新建项目 三 配置VS 四 创建项目 一 安装VC Linux exe 下载地址 xff1a 二 打开VS 选择新建项目 三 配置VS 打开VS xff0c 菜单栏点击工具 gt 选
  • MiniFly微型四轴学习与开发日志(四)

    文章目录 任务创建和删除 API 函数任务调度器开启函数分析临界区atkp c 任务创建和删除 API 函数 FreeRTOS 最基本的功能就是任务管理 xff0c 而任务管理最基本的操作就是创建和删除任务 xff0c FreeRTOS 的
  • Git常用命令

    目录 一 提交代码 二 更新本地代码 三 修改项目中Git远程仓库地址 1 开启Git Bash 2 查看git远程仓库地址 3 修改远程仓库地址 4 检查新地址 Git常用命令备忘 一 提交代码 1 在项目内点击Git Bash Here
  • linux动态库找不到

    linux动态库找不到 一 分析二 解决方式一方式二方式三 三 如何检查RPATH的值 问题状态 xff1a xxx so cannot open shared object file No such file or directory 一
  • ubuntu14.04LTS下创建Qt5.5.1桌面快捷方式

    以下是网上的方法 xff0c 我试了一下 xff0c 反正没成功 Ubuntu14 04LTS在桌面上创建Qt5 4 1快捷方式 1 下载并安装Qt5 4 1 xff0c 我的安装路径时home cao Qt5 4 1 xff08 默认路径
  • Linux操作系统之一:简述Linux系统开机引导和启动过程

    Linux操作系统之一 xff1a 简述Linux系统开机引导和启动过程 操作系统的启动分为两个阶段 xff1a 引导boot 启动startup 引导阶段开始于打开电源开关 xff0c 结束于内核初始化完成和 systemd 进程成功运行
  • TCP IP与UDP含义 区别 总结

    TCP IP协议 xff08 一 xff09 网络基础知识 OSI参考模型中每个分层的作用 1 3 1 应用层 xff1a 为应用程序提供服务并规定应用程序中通信相关的细节 xff1b 包括的协议如下 xff1a xff1a 超文本传输协议
  • STM32F103 CAN总线配置总结

    stm32的can总线的配置如下 xff1a CAN InitStructure CAN TTCM 61 DISABLE 禁止时间触发通信模式 CAN InitStructure CAN ABOM 61 DISABLE CAN InitSt
  • 新版标准日本语初级_第四十八课

    语法 1 自谦语 xff1a 自谦语是通过压低说话人自身或说话人一方的形式表示敬意的表达方式 如跟别人谈到自己的家人或自己公司的上级时 xff0c 也使用自谦语 2 43 一类动 二类动 或 43 三类动的汉字部分 xff1a 这是自谦语中
  • STM32同时使用多个定时器

    代码如下 xff1a span class token keyword void span span class token function TIM2 IRQHandler span span class token punctuatio
  • Qt之定时器

    文章目录 QObject类的定时器定时器类QTimer Qt使用定时器有两种方法 xff0c 一种是使用QObiect类的定时器 xff0c 一种是使用QTimer类 定时器的精确性依赖于操作系统和硬件 xff0c 大多数平台支持20ms的