QT----基于QML的计时器

devtools/2024/9/24 1:53:14/

赶上了实习的末班车,现在在做QML开发,第一天的学习成果,一个计时器.逻辑挺简单的,纯QML实现,代码在仓库QT-Timer
在这里插入图片描述

多线程优化

在使用的过程中发现自己的计时器时间会慢,并且一直点击记录的话时间1s可以走10s,排查发现是在计时器的间隔取得太小了,取了1太过于消耗资源,改成10的话能解决这个问题.同时也想尝试使用线程来解决.

新建TimerThread 类继承自QObject,只有这样才能使用线程.我们需要发送时间和运行的状态,因此使用信号和QML文件通信

#ifndef TIMERTHREAD_H
#define TIMERTHREAD_H#include <QObject>
#include <QTimer>
#include <QThread>
#include <cmath>/******************************************************************************** @file       timerthread.h* @brief      把计时放入线程** @author     纯真丁一郎* @date       2024/09/18* @Blog       https://www.relxdingyilang.cn/* @history*****************************************************************************/class TimerThread : public QObject
{Q_OBJECT
public:explicit TimerThread(QObject *parent = nullptr);//判断运行状态bool isRunning = false;QString caculateTime(int totaltime);signals:void timeUpdated(QString totaltimestr); //发送时间给主界面void sig_isRunning(bool isRunning);//发送状态public slots:void start();void stop();void pause();void onTimeout();private:int m_totaltime; //总时间QTimer *timer;
};#endif // TIMERTHREAD_H

cpp里实现计时的功能启动计时器,计算时间格式.使用定时器的timeout信号,让我们的时间增加

#include "timerthread.h"TimerThread::TimerThread(QObject *parent): QObject{parent}
{m_totaltime = 0;timer = new QTimer(this);connect(timer,&QTimer::timeout,this,&TimerThread::onTimeout);}void TimerThread::start(){timer->start(1);isRunning = true;emit sig_isRunning(isRunning);
}void TimerThread::pause(){timer->stop();isRunning = false;emit sig_isRunning(isRunning);
}void TimerThread::stop(){timer->stop();isRunning = false;m_totaltime = 0;emit sig_isRunning(isRunning);
}void TimerThread::onTimeout(){//计时m_totaltime += 1;emit timeUpdated(caculateTime(m_totaltime));
}QString TimerThread::caculateTime(int totaltime){//格式化字符串int millisecond =totaltime % 1000;millisecond = std::floor(millisecond/10);int second = int(std::floor(totaltime /1000) )% 60;int minute = int(std::floor(totaltime/1000 /60)) % 60;QString result = (minute<10 ? "0":"") + QString::number(minute)+":"+(second<10 ? "0":"") + QString::number(second) + ":"+(millisecond<10 ? "0":"")+QString::number(millisecond);return result;
}

在main.cpp里实现多线程,实例化timerThread类,在实例化一个工作线程,把我们自己的类放入工作线程,启动工作线程即可.
同时我们需要qmlRegisterType来注册我们的类,这样才能让QML文件知道要与这个文件通信

 //注册计时线程,并将计时线程移动到工作线程TimerThread timerThread;QThread workerThread;timerThread.moveToThread(&workerThread);//启动工作线程workerThread.start();QQmlApplicationEngine engine;qmlRegisterType<TimerThread>("com.timerthread",1,0,"TimerThread");

main.qml的修改,首先使用import倒入我们的timerThread类,这样我们就可以在qml中实例化,可以加上idimport com.timerthread 1.0

定义两个变量,接受我们信号发送的参数.发送的参数的作用域只在Connection里,所以需要外部变量来接收,方便我们的使用,

 property bool isrunning: falseproperty string totaltime: ""TimerThread{id:timerThread}Connections{target:timerThread// 使用传递过来的 totaltime 参数,信号传递出来的参数在connect内部可以直接使用,在外部不行onTimeUpdated:{timerDisplay.text = totaltimestrtotaltime = totaltimestr//console.log(totaltime)}onSig_isRunning:{isrunning = isRunningconsole.log(isRunning)}}

后边就将原来的一些变量替换为新接收的变量就行.

使用多线程的方式,定时器间隔取1也能精确计时,线程起到了作用

点击访问博客查看更多内容

http://www.ppmy.cn/devtools/116261.html

相关文章

【QT基础】创建项目项目代码解释

目录 前言一&#xff0c;使⽤Qt Creator 新建项目1. 新建项目2. 选择项⽬模板3. 选择项⽬路径4. 选择构建系统5. 填写类信息设置界⾯6. 选择语⾔和翻译⽂件7. 选择Qt套件8. 选择版本控制系统9. 最终效果 二&#xff0c;项目代码说明1. main.cpp文件2. Widget.h文件3. Widget.cp…

大数据系统调优:从DAG到单机

目标&#xff1a;优化T10的时效性全局DAG调度层优化&#xff1a;提前任务开始时间&#xff1a; 1. 优化慢结点&#xff1a;T10依赖了T4,T7,T8, 其中T8为瓶颈&#xff0c;如果T8能提前点完成&#xff0c;T10可以早点开始&#xff0c;就能早点完成 2. 快结点做更多预计算…

数据库_解决SQL Server数据库log日志过大,清理日志文件方法

SQL Server数据库日志文件过大的原因主要有几个方面&#xff1a; 事务日志记录了所有对数据库进行修改的操作&#xff0c;如插入、更新和删除&#xff0c;这些操作会不断增加日志文件的大小。 长时间运行且未正确结束的事务会持续占用事务日志中的空间&#xff0c;导致日志文…

Kubernets基础-包管理工具Helm详解

文章目录 什么是Helm?Helm 的基本概念Helm 的工作原理Helm 的主要功能使用 Helm 的步骤 values.yaml和Chart.yamlvalues.yaml 文件示例Chart.yaml 文件示例 什么是Helm? Helm 是 Kubernetes 的一个非常流行的包管理工具&#xff0c;它使得在 Kubernetes 上部署应用程序变得更…

医学数据分析实训 项目三 关联规则分析预备项目---购物车分析

文章目录 1 预备项目关联规则分析实践———购物车分析1 产生频繁集2 产生关联规则 1 预备项目 关联规则分析实践———购物车分析 import warnings import numpy as np import pandas as pd from mlxtend.frequent_patterns import apriori from mlxtend.frequent_patterns …

【Git】初识Git

本篇文章的环境是在 Ubuntu/Linux 环境下编写的 文章目录 版本控制器Git 基本操作安装 Git创建 Git 本地仓库配置 Git认识工作区、暂存区、版本库添加文件修改文件版本回退撤销修改删除文件 版本控制器 在日常工作和学习中&#xff0c;老板/老师要求我们修改文档&#xff0c;…

SpringBoot 消息队列RabbitMQ 消息确认机制确保消息发送成功和失败 生产者确认

介绍 有Publisher Confirm(成功)和Publisher Return(失败)两种确认机制。开启确机制认后&#xff0c;在MQ成功收到消息后会返回消息给生产者。 消息投递到了MQ &#xff0c;但是路由失败。此时会通过PublisherReturn返回路由异常原因&#xff0c;然后返回ACK&#xff0c;告知…

[杂谈-黑神话:悟空] 中国3A游戏的崛起之路:挑战与机遇并存

[杂谈-黑神话:悟空] 中国3A游戏的崛起之路&#xff1a;挑战与机遇并存 《黑神话&#xff1a;悟空》的出现&#xff0c;让我们看到了中国3A游戏的希望和未来。对于中国游戏产业的从业者和爱好者来说&#xff0c;这是一个值得关注和期待的领域。 在游戏产业蓬勃发展的今天&#…