Qt6 C++基础入门1 定时器与QTimer

news2024/11/28 14:39:39

定时器


定时器图片流水灯案例

实现效果:构建一个界面,点击开始按钮轮流播放文件夹下图片,点击停止按钮停止播放

在这里插入图片描述

构建页面,上部是一个没有内容的 label
下面是开始和暂停按钮,各自的名称分别为 startBtn 和 stopBtn


先保持在 UI 设计界面别走
右键点击开始和停止按钮,选择添加槽,各自添加一个 clicked 槽!

此时不需要为槽添加响应内容,我们打开 Widget.h

下图注释部分即为我们需要添加的部分

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

// 第一步:定义轮播间隔时间
#define TIMEOUT 1*1000

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);

    // 第二步:定义虚函数timerEvent,表示定时器事件,他接受一个QTimerEvent类型的参数
    virtual void timerEvent(QTimerEvent *evt);
    ~Widget();

private slots:

    // 第三步:我们为两个按钮添加槽后,这边自动生成的代码
    void on_startBtn_clicked();
    void on_stopBtn_clicked();

private:
    Ui::Widget *ui;

    // 第四步:定义定时器ID(保证定时器的唯一性),以及当前图片轮播ID
    int myTimerId;
    int pixId;
};
#endif // WIDGET_H

头文件已经处理完毕,打开 Widget.cpp

首先在 widget 初始化时,我们就需要为 label 指定显示一张图片

#include "Widget.h"
#include "ui_Widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 下一张图片ID
    pixId = 2;
    // 默认显示的图片,即第一张图片1.png
    QPixmap pix("E:\\singlechip\\Linux\\qt\\qt_demo2\\image\\1.png");
    // 将图片绑定到界面内部的label里去
    ui->label->setPixmap(pix);
}

为两个信号槽定义代码

// 开始按钮
void Widget::on_startBtn_clicked()
{
    // 开启定时器,并且返回定时器编号
    myTimerId = this->startTimer(TIMEOUT);
}

// 停止按钮
void Widget::on_stopBtn_clicked()
{
    // 杀死指定ID的定时器
    this->killTimer(myTimerId);
}

还记得我们之前在头文件中注册的虚函数 timerEvent 吗?
我们需要在这边实现它,定义事件处理函数

void Widget::timerEvent(QTimerEvent *evt)
{
    // 如果取得的定时器ID不对应,那么不执行后续代码
    if(evt->timerId()!=myTimerId) return;

    // 字符串拼接获得图片路径
    QString path("E:\\singlechip\\Linux\\qt\\qt_demo2\\image\\");
    path+=QString::number(pixId);
    path+=".png";

    // 将图片路径绑定到label上,以便显示图片
    QPixmap pix(path);
    ui->label->setPixmap(pix);

    // 每次显示完毕后ID都自增一次,直到递增超过文件夹下最大图片数量,就重置为1,从头开始显示
    pixId++;
    if(pixId==3) pixId=1;
}

这是完整的 Widget.cpp 代码:

#include "Widget.h"
#include "ui_Widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    pixId = 2;
    QPixmap pix("E:\\singlechip\\Linux\\qt\\qt_demo2\\image\\1.png");
    ui->label->setPixmap(pix);
}

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


void Widget::on_startBtn_clicked()
{
    // 开启定时器,并且返回定时器编号
    myTimerId = this->startTimer(TIMEOUT);
}

void Widget::timerEvent(QTimerEvent *evt)
{
    if(evt->timerId()!=myTimerId) return;

    QString path("E:\\singlechip\\Linux\\qt\\qt_demo2\\image\\");
    path+=QString::number(pixId);
    path+=".png";

    QPixmap pix(path);
    ui->label->setPixmap(pix);

    pixId++;
    if(pixId==3) pixId=1;
}


void Widget::on_stopBtn_clicked()
{
    this->killTimer(myTimerId);
}

大功告成,你现在可以点击左下角的绿色按钮执行测试了


QTimer

QTimer 的使用方式和上面那个差不多,只是稍微流程有些变动

打开 widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

// 导入QTimer
#include <QTimer>
// 设置好间隔时间
#define TIMEOUT 1*1000

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    // 需要手动在此注册超时函数的槽
    void timeout_slot();

    // 定义开始和停止按钮的点击槽
    void on_startBtn_clicked();
    void on_stopBtn_clicked();

private:
    Ui::Widget *ui;

    // 定义QTimer全局变量
    QTimer *timer;
    // 定义计数器,指示当前数字
    int currentNumber;
};
#endif // WIDGET_H

这是对应的 widget.cpp 代码清单

#include "Widget.h"
#include "ui_Widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 实例化计时器
    timer = new QTimer;

    // 初始值为0,显示在label内部,注意数值和文本之间的类型转换
    currentNumber=0;
    ui->label->setText(QString::number(currentNumber));

    // 使用connect链接信号和槽!
    connect(timer,&QTimer::timeout,this,&Widget::timeout_slot);
}

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


void Widget::on_startBtn_clicked()
{
    // 开启计时器
    timer->start(TIMEOUT);
}

// 超时函数,每经过一次计时周期(TIMEOUT的长度),就会执行一次如下槽内的代码
void Widget::timeout_slot()
{
    currentNumber++;
    ui->label->setText(QString::number(currentNumber));
}


void Widget::on_stopBtn_clicked()
{
    // 停止计时器
    timer->stop();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/607464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.事件绑定

目录 1 事件对象的属性 2 事件绑定方式 3 在事件中赋值 4 事件传参 1 事件对象的属性 target是触发该事件源头的组件&#xff0c;currentTarget是当前事件所绑定的组件&#xff0c;比如现在有一个父组件包着子组件&#xff0c;你给父组件绑定事件&#xff0c;由于事件…

ps磨皮插件专用智能磨皮插件Portraiture4

Portraiture是一款智能磨皮插件&#xff0c;为Photoshop和Lightroom添加一键磨皮美化功能&#xff0c;快速对照片中皮肤、头发、眉毛等部位进行美化&#xff0c;无需手动调整&#xff0c;大大提高P图效率。全新4版本&#xff0c;升级AI算法&#xff0c;并独家支持多人及全身模式…

从0到1深入剖析微服务架构,阿里人十年经验浓缩成一份笔记

前言 数字化经济的快速发展和云计算给底层IT系统带来的巨大变革正是当下微服务架构快速发展的时代背景。Gartner预计&#xff0c;从2018年到2022年&#xff0c;PaaS将成为未来的主流平台交付模式&#xff0c;而PaaS平台需要更加灵活的云原生应用架构做技术支撑&#xff0c;微服…

图论与算法(3)图的深度优先遍历

1. 遍历的意义 1.1 图的遍历 图的遍历是指按照一定规则访问图中的所有顶点&#xff0c;以便获取图的信息或执行特定操作。常见的图遍历算法包括深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;。 深度优先搜索&#xff08;DFS&#xff0…

UART串口通信实验

不管是单片机开发还是嵌入式 Linux 开发&#xff0c;串口都是最常用到的外设。 可以通过串口将开发板与电脑相连&#xff0c;然后在电脑上通过串口调试助手来调试程序。 还有很多模块&#xff0c;比如蓝牙、GPS、GPRS等都使用串口与主控进行通信。 UART简介 串口全称串行接口…

vb6 Webview2微软Edge Chromium内核执行JS取网页数据测速

微软Edge Chromium内核执行JS获取网页数据测试 ExcuteScript eval(document.body.innerHTML) from : https://www.163.com 采集的网页HTM字符串占用字节空间1.2MB ExcuteScript回调事件中取得JS执行结果&#xff0c;用时 54 毫秒 其中JSON转字符13.5209毫秒 jSON数据长度: 增…

ChatGPT更新说明(20230524)

原文传送门&#xff1a;ChatGPT — Release Notes 更新说明&#xff08;5月24日&#xff09; 简要&#xff1a;iOS应用在更多国家可用&#xff0c;Alpha测试中的共享链接&#xff0c;Bing插件&#xff0c;iOS上的历史记录禁用 ChatGPT iOS应用在更多国家可用 好消息&#xf…

Elasticsearch:如何使用集群级别的分片分配过滤(不包括节点)安全地停用节点

当你想停用 Elasticsearch 中的节点时&#xff0c;通常的过程不是直接销毁节点。 如果你这样做&#xff0c;那么你就有数据丢失的风险&#xff0c;这不是你想要对应该是可靠的数据库做的事情。 这样做的问题是&#xff0c;节点很可能会通过 Elasticsearch 处理的恰当命名的分片…

Character.AI成为新晋AI聊天应用爆款;谷歌推出 Google Slides AI 图像生成

&#x1f989; AI新闻 &#x1f680; Character.AI&#xff1a;首周下载量超越ChatGPT&#xff0c;成为新晋AI聊天应用爆款 摘要&#xff1a;Character.AI是一款受欢迎的人工智能聊天应用&#xff0c;用户可以自由创建AI角色&#xff0c;并与它们聊天。该应用于2023年5月23日…

C#,码海拾贝(32)——计算“实对称三对角阵的全部特征值与特征向量的”之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 矩阵类 /// 作者&#xff1a;周长发 /// 改进&#xff1a;深度混淆 /// https://blog.csdn.net/beijinghorn /// </summary> public partial class Matrix {…

【Mysql】 表的约束

文章目录 【Mysql】 表的约束空属性默认值列描述zerofill主键自增长唯一键外键综合案例 【Mysql】 表的约束 上一个博客记录的是mysql中的类型&#xff0c;这篇博客记录的是mysql中的表的约束&#xff1b;即列字段对插入数据的约束 空属性 俩个值&#xff1a; null (默认) 和…

Vue3 + ElementPlus实战学习——模拟简单的联系人列表管理后台

文章目录 &#x1f4cb;前言&#x1f3af;demo 介绍&#x1f3af;功能分析&#x1f9e9;数据的展示与分页功能&#x1f9e9;编辑功能&#x1f9e9;删除功能 &#x1f3af;部分代码分析&#x1f3af;完整代码&#x1f4dd;最后 &#x1f4cb;前言 这篇文章介绍一下基于 Vue3 和…

DataSpell第一次安装使用教程

官网&#xff1a; Download DataSpell: The IDE for Data Scientists (jetbrains.com) 双击.exe文件开始安装 安装过程就一直点击下一步就好&#xff0c;遇到方框需要勾选的全部勾上。 注意尽量别安装在C盘&#xff0c;我安装在了D盘。 获取jihuoma&#xff1a;(484条消息)…

MySql学习1:安装

前言 学习教程&#xff1a;黑马程序员 MySQL数据库入门到精通&#xff0c;从mysql安装到mysql高级、mysql优化全囊括 目前的打算是跟着教程学习基础部分&#xff0c;进阶和运维部分以后可能会学习。 安装 关于如何安装mysql可以跟着视频里的操作&#xff0c;但是对于我这种…

盘点一个AI你画我猜的小工具

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 寻声暗问弹者谁&#xff0c;琵琶声停欲语迟。 大家好&#xff0c;我是Python进阶者。 一、前言 前几天在【ChatGPT&AI破局俱乐部】知识星球发现了一…

【Python】Python系列教程-- Python3 字典(十四)

文章目录 前言创建空字典访问字典里的值修改字典删除字典元素字典键的特性字典内置函数&方法 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python系列教程–Python3 环境搭建&#xff08;二&#xff09;Python系列教程–Python3 VS…

【Java】Java(四十七):单元测试

文章目录 1. 概述2. 特点3. 使用步骤4. 相关注解5. 疑惑: 有了main函数 为啥还要 单元测试6. 后记 1. 概述 JUnit是一个 Java 编程语言的单元测试工具。JUnit 是一个非常重要的测试工具 2. 特点 JUnit是一个开放源代码的测试工具。提供注解来识别测试方法。JUnit测试可以让…

在k8s平台部署个人博客(三)

先下载实战-在k8s平台部署个人博客-资源包 再K8s部署个人博客 实验步骤如下&#xff1a; [rootk8s-master]# kubectl create secret generic mysql-pass --from-literalpasswordYOUR_PASSWORD #把mysql.tar.gz和wordpress.tar.gz上传到K8s工作节点&#xff0c;手动解压即可…

java企业级信息系统开发学习笔记09 利用MyBatis实现CRUD操作

文章目录 一、学习目标利用MyBatis查询表记录利用MyBatis插入表记录利用MyBatis更新表记录利用MyBatis删除表记录 二、查询表记录1.打开mybatis项目&#xff08;一&#xff09;在映射器配置文件里引入结果映射元素&#xff08;二&#xff09;添加按姓名查询用户记录功能1、添加…

软考——下午题部分,例题一,二,三,六

例题一 11年上半年 病人&#xff0c;护理人员&#xff0c;医生 D 生命体征范围文件 日志文件 病历文件 治疗意见文件 14年上 E1 巴士司机,2 机械师,3 会计,4 主管,5 库存管理系统 D 巴士列表文件 维修记录文件 部件清单 人事档案 14年下 1 客户 2 供应商 D 销售订单表 库存…