基于Qt的上位机通用框架
0.前言
最近一年多的时间一直在开发设备控制相关的软件,加上之前在聚光的两年时间,前前后后开发这种设备控制类型的上位机软件也有三年的时间了。总结出了一套基于Qt的上位机编程框架,核心思想类似于C#的依赖注入,对象的初始化都是基于反射和配置文件生成的,通过修改配置文件就能实现控制流程的修改。
该框架分为基本模块、通讯层、设备层、指令层、控制层五个核心模块,上层调用下层,主要通过Manager单例读取配置json文件,创建并配置对应实体,再将实体指针由Manager管理,可以有效防止内存泄漏等问题。
项目gitee地址
1.基本模块
定义了BaseFactory、BaseItem、BaseManager三个底层基类,BaseFactory定义了类型注册和实体创建两个方法,主要用于每个模块内的实体创建工作。
#pragma execution_character_set("utf-8")
#ifndef BASEFACTORY_H
#define BASEFACTORY_H
#include <QObject>
#include <QMap>
#include <QDebug>
#include "BaseItem.h"class BaseFactory
{
public:BaseFactory();virtual BaseItem* CreateInstance(QString concreteType);template <typename T1>int Register(){int preCount=_map.count();const QMetaObject& meta = T1::staticMetaObject;_map.insert(meta.className(),&meta);if(preCount+1!=_map.count()){throw QString("%1注册失败,请检查!").arg(meta.className());}return _map.count();}protected:QMap<QString,const QMetaObject*> _map;
};
BaseItem主要定义了框架内所有实体的配置接口和配置文件创建接口
#pragma execution_character_set("utf-8")
#ifndef BASEITEM_H
#define BASEITEM_H#include <QObject>
#include <QJsonObject>
#include <QJsonDocument>
#include <QException>
#include <QSharedPointer>
#include <QDebug>
#include "InterruptedException.h"class BaseItem : public QObject
{Q_OBJECT
public:explicit BaseItem(QObject *parent = nullptr);QString Name();void SetName(QString name);virtual void SetConfig(QJsonObject obj);virtual QJsonObject Config();virtual void SetOtherConfig(QJsonObject other);virtual bool Init();virtual QWidget* GetConfigWidget();virtual QSharedPointer<QWidget> GetConfigWidgetZZZ();protected:QString _name;QJsonObject _obj;QJsonObject _other;signals:public slots:
};#endif // BASEITEM_H
BaseManager主要定义了Manager类的的基本方法,主要通过读取配置文件,使用工厂模式创建对应的实体对象,再将配置文件中的json对象参数传入对象完成初始化,最后再将这些实体对象指针通放入QList容器,简化对象的管理和监控。

2.通讯层
定义了SendReply、Publisher、Subscriber、Requester、Replyer、Modbus物种基本的通讯类。并且实现了SendReply、Modbus通讯方式的网口和串口模式,基于zmq实现了Publisher、Subscriber、Requester、Replyer四种通讯模式。
CommunicationManger创建并且管理这些通讯实例,并且具有通讯监控、断线重连等功能,方便再设备运行期间对通讯状态的异常排查。

3.设备层
定义了IO模块、测距仪、电机控制器等常用设备,完成了不同品牌的具体实现

4.指令层/控制层
整体业务核心部分,将所有软件执行流程分为分解为多个指令,内部通告异常抛出实现控制流程的中断,大大简化控制流程,通过调整不同指令的位置,可以实现控制流程的自由组合。通过设置不同的权重,可以实现进度报告等功能。
5.中断
将整体业务执行流程分为瞬态控制和等待,在每个等待中使用WaitMs(int time)方法实现业务的中断功能。
#pragma execution_character_set("utf-8")#include "WaitUtils.h"
#include <QTime>
#include <QDebug>
#include <QCoreApplication>
#include <QElapsedTimer>WaitUtils::WaitUtils(QObject *parent) : QObject(parent)
{}bool WaitUtils::_isRunning=false;void WaitUtils::WaitMs(int time)
{//多处调用displayProgress该变量且有的时true有的时false时会导致进度显示异常,想不通。。。QElapsedTimer ela;ela.start();while (ela.elapsed() < time){CheckIsRunning();QCoreApplication::processEvents(QEventLoop::AllEvents, 100);}
}void WaitUtils::WaitMsNoException(int msec)
{//多处调用displayProgress该变量且有的时true有的时false时会导致进度显示异常,想不通。。。QElapsedTimer ela;ela.start();while (ela.elapsed() < msec){QCoreApplication::processEvents(QEventLoop::AllEvents, 300);}
}void WaitUtils::Reset()
{_isRunning=true;
}void WaitUtils::Stop()
{_isRunning=false;
}void WaitUtils::WaitMsNoProgress(int time)
{QElapsedTimer ela;ela.start();while (ela.elapsed() < time){CheckIsRunning();QCoreApplication::processEvents(QEventLoop::AllEvents, 300);}
}void WaitUtils::CheckIsRunning()
{if(!_isRunning){throw QString("流程中止");}
}
7.设计模式
本框架主要使用指令模式、工厂模式、模板模式这三种设计模式,感兴趣的读者可以去看看gof的《设计模式》。
相关文章:
基于Qt的上位机通用框架
0.前言 最近一年多的时间一直在开发设备控制相关的软件,加上之前在聚光的两年时间,前前后后开发这种设备控制类型的上位机软件也有三年的时间了。总结出了一套基于Qt的上位机编程框架,核心思想类似于C#的依赖注入,对象的初始化都…...
Vulnhub靶场DC-7练习
目录 0x00 准备0x01 主机信息收集0x02 站点信息收集1. 获取用户名/密码2. ssh连接目标主机3. drush命令修改Drupal密码 0x03 漏洞查找与利用1. Drupal写入php木马2. 连接shell3. 反弹shell并提权 0x04 总结 0x00 准备 下载链接:https://download.vulnhub.com/dc/DC-…...
吴恩达深度学习笔记1 Neural Networks and Deep Learning
参考视频:(超爽中英!) 2024公认最好的【吴恩达深度学习】教程!附课件代码 Professionalization of Deep Learning_哔哩哔哩_bilibili Neural Networks and Deep Learning 1. 深度学习引言(Introduction to Deep Learning) 2. 神 经 网 络 的 编 程 基 础…...
(十)Spring教程——Spring配置概述
目录 前言 1.Spring容器高层视图 2.基于XML的配置 前言 在使用Spring所提供的各项丰富而神奇的功能之前,必须在Spring IoC容器中装配好Bean,并建立好Bean和Bean之间的关联关系。Spring的配置文件已经很精简了,但是广大的开发者希望它做得更…...
飞书群聊机器人自定义机器人接入,并实现艾特@群成员功能
飞书群聊机器人还是比钉钉的要麻烦一点,钉钉的直接通过手机号就可以艾特群里面的人,但是飞书的要想艾特群里面的人,需要使用用户的 Open ID 或 User ID。这两个ID怎么获取呢?还需要在飞书的开放平台上创建一个应用,然后…...
CrowdStrike更新致850万Windows设备宕机,微软紧急救火!
7月18日,网络安全公司CrowdStrike发布了一次软件更新,导致全球大范围Windows系统宕机。 预估CrowdStrike的更新影响了将近850万台Windows设备,多行业服务因此停滞,全球打工人原地放假,坐等吃瓜,网络上爆梗…...
银行黄金交易流程
银行黄金交易流程 银行黄金交易流程通常包括以下几个步骤: 咨询和开户: 首先,客户需要到银行的贵金属交易柜台或在线平台咨询黄金交易的相关规定和手续,然后进行开户,在银行开立有关黄金交易的账户。这可能需要提供个…...
MATLAB实验五:MATLAB数据分析
1. 某线路上不同时间对应的电压如下表所示: 1)用 3 次多项式拟合(polyfit)该实验曲线,要求绘制 2 原始采样 点,并在 1~8 范围内,使用时间间隔为 0.2 的数据绘制拟合曲线。 建立一个脚本文件:text5_1.m 如下…...
Cannot perform upm operation: connect ETIMEDOUT 34.36.199.114:443 [NotFound]
版本:Unity 2018 Windows 问题:打开 Package Manager,加载报错 尝试解决: 删除项目文件里的Packages下的mainfest.json文件,然后重新打开项目(X)重新登录 Unity 账号(X)…...
Docusaurus VS VuePress:哪一个更适合你的技术文档?
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
昇思25天学习打卡营第25天|MindNLP ChatGLM-6B StreamChat
配置环节 %%capture captured_output !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2.14 !pip install mindnlp !pip install mdtex2html配置国内镜像 !export HF_ENDPOINThttps://hf-mirror.com下载与加载模型 from m…...
海康威视综合安防管理平台 detection 前台RCE漏洞复现
0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 海康…...
【BUG】已解决:ModuleNotFoundError: No module named ‘PIL‘
已解决:ModuleNotFoundError: No module named ‘PIL‘ 目录 已解决:ModuleNotFoundError: No module named ‘PIL‘ 【常见模块错误】 错误原因: 解决办法: 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我…...
css font 优化
文章目录 使用 font-display 控制字体加载预加载关键字体选择合适的字体文件类型按需创建字体文件HTTP 缓存优化 使用 font-display 控制字体加载 避免字体加载导致的空白 block:浏览器在短暂的阻塞期内不显示任何文本,直到字体加载完成。这可能导致页…...
Go之Web急速入门Gin+Gorm框架
简介 只作为快速入门、了解Go的GinGorm框架的demo,不能作为企业级开发。 详细用法请看官网 《Gin官网》 《Gorm官网》 使用GoLand创建Go项目(默认modules) go版本1.22.2 需要设置代理下载go相关软件包,否则软件包可能无法下载。…...
【MySQL进阶之路 | 高级篇】ER模型
1. 概述 数据库设计是牵一发而动全身的。那么有没有什么办法可以提前看到数据库的全貌呢?比如需要哪些数据表,数据表中应该有哪些字段,通过什么字段进行连接等等。这样我们才能进行整体的梳理和设计。 其实,ER模型就是一个这样的…...
C++基础语法:STL之容器(4)--序列容器中的list(一)
前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 序列容器的学习.以<C Prime Plus> 6th Edition(以下称"本书")内容理解 本书中容器内容不多只有几页.最好是有数据结构方面的知识积累,如果没有在学的同时补上. 序列容器回顾:序列容器内元素按严格…...
WordPress杂技
WordPress杂技 WordPress页面构建器: Avada、Elementor、astra、 Elementor作为一款强大的页面构建工具。 Avada:是一款非常受欢迎的WordPress主题,它的设计理念是简洁、现代、响应式,Avada拥有丰富的模板和布局,可以轻松创建出…...
鸿蒙 动态共享包HSP的创建和引用
1.什么是动态共享包HSP HSP(Harmony Shared Package)是动态共享包,可以包含代码、C库、资源和配置文件,通过HSP可以实现代码和资源的共享。HSP不支持独立发布,而是跟随其宿主应用的APP包一起发布,与宿主应…...
ARM架构(二)—— arm v7-a/v8/v9寄存器介绍
1、ARM v7-A寄存器 1.1 通用寄存器 V7 V8开始 FIQ个IRQ优先级一样, 通用寄存器:31个 1.2 程序状态寄存器 CPSR是程序状态毒存器,保存条件标志位,中断禁止位,当前处理器模式等控制和状态位。每种异常模式下还存在SPS…...
5分钟搞定ollama+qwen2.5模型配置:从下载到对话测试全流程指南
5分钟极速部署ollama与qwen2.5:零基础打造本地AI对话系统 在AI技术平民化的今天,拥有一个本地运行的对话模型不再是专业开发者的专利。本文将带您用最短时间完成ollama服务部署与qwen2.5模型配置,无需复杂环境搭建,从零开始构建属…...
3个核心价值重塑漫画阅读体验:Venera跨平台漫画阅读器全面解析
3个核心价值重塑漫画阅读体验:Venera跨平台漫画阅读器全面解析 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera 当你在手机上读到精彩漫画章节却不得不中断通勤,回家后打开电脑却要重新寻找上次阅读位置…...
快充、便携、安全兼备,Anker能量盒到底香不香?
随着无线互联网时代的到来,移动设备的续航问题成为人们的新烦恼。无论是频繁出差、旅行,还是移动办公,充电宝几乎已经成为随身必备的装备。 然而,传统充电宝往往存在充电速度慢、体积笨重、功能单一,甚至安全认证不完善…...
终极指南:Autoenv如何彻底解决团队开发环境配置难题
终极指南:Autoenv如何彻底解决团队开发环境配置难题 【免费下载链接】autoenv 项目地址: https://gitcode.com/gh_mirrors/aut/autoenv Autoenv是一款强大的目录环境管理工具,能够在您进入包含.env文件的目录时自动执行其中的环境配置࿰…...
taocms v3.0.2漏洞防御指南:如何避免.htaccess文件被恶意利用
Taocms v3.0.2安全加固实战:从漏洞原理到防御体系构建 当网站管理后台的.htaccess文件成为攻击者的跳板时,系统安全便形同虚设。近期曝光的Taocms v3.0.2远程代码执行漏洞(CVE-2022-25578)正是利用了这一薄弱环节,攻击…...
自然语言处理助力法律领域AI架构,提升司法服务质量
自然语言处理助力法律领域AI架构:从技术落地到司法服务升级的全链路实践 1. 引言:法律行业的“效率痛点”与NLP的破局之路 1.1 痛点引入:当法律遇到“信息过载”与“专业门槛” 深夜十点的律师办公室里,张律师还在揉着太阳穴核对第三份合同的条款——密密麻麻的法条引用…...
League-Toolkit:英雄联盟智能辅助工具的效率提升之道
League-Toolkit:英雄联盟智能辅助工具的效率提升之道 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit是…...
从零构建一个轻量级WebSocket服务器:基于libwebsockets的实战与事件循环剖析
从零构建一个轻量级WebSocket服务器:基于libwebsockets的实战与事件循环剖析 在当今实时应用盛行的时代,WebSocket技术已成为构建即时通讯、实时数据推送等功能的基石。不同于传统的HTTP请求-响应模式,WebSocket提供了全双工通信能力…...
终极指南:Windows虚拟磁盘驱动器的完整解决方案ImDisk深度解析
终极指南:Windows虚拟磁盘驱动器的完整解决方案ImDisk深度解析 【免费下载链接】ImDisk ImDisk Virtual Disk Driver 项目地址: https://gitcode.com/gh_mirrors/im/ImDisk ImDisk Virtual Disk Driver是一款专为Windows系统设计的虚拟磁盘驱动解决方案&…...
amlogic-s9xxx-armbian项目全指南:从闲置设备到智能服务器的转变
amlogic-s9xxx-armbian项目全指南:从闲置设备到智能服务器的转变 【免费下载链接】amlogic-s9xxx-armbian amlogic-s9xxx-armbian: 该项目提供了为Amlogic、Rockchip和Allwinner盒子构建的Armbian系统镜像,支持多种设备,允许用户将安卓TV系统…...
