基于Qt的上位机通用框架

news2024/11/15 13:49:59

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的《设计模式》。

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

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

相关文章

【启明智显分享】甲醛检测仪HMI方案:ESP32-S3方案4.3寸触摸串口屏,RS485、WIFI/蓝牙可选

今年&#xff0c;“串串房”一词频繁引发广大网友关注。“串串房”&#xff0c;也被称为“陷阱房”“贩子房”——炒房客以低价收购旧房子或者毛坯房&#xff0c;用极度节省成本的方式对房子进行装修&#xff0c;之后作为精修房高价租售&#xff0c;因甲醛等有害物质含量极高&a…

[Python库](5) rich库

作者制作不易&#xff0c;关注、点赞、收藏一下吧&#xff01; 目录 1.rich库简介 2.下载并导入rich库 2.1.下载 2.2.导入 3.使用 3.1.输出表情包 3.2.文本的样式 3.3.表格 3.4.日志 1.rich库简介 Rich 是一个 Python 库&#xff0c;用于在终端中添加丰富的文本&…

月影护眼大路灯怎么样?书客|月影|霍尼韦尔超硬核实力性能测评pk!

月影护眼大路灯怎么样&#xff1f;选到专业优质的护眼大路灯是真的可以使我们在用眼时减少疲劳感&#xff0c;达到护眼效果&#xff0c;但如果不慎买到劣质的护眼灯产品&#xff0c;不仅达不到健康的环境光&#xff0c;还越用越觉得眼睛疲劳感加重&#xff0c;在水深的护眼灯市…

数学建模(7)——Logistic模型

一、马尔萨斯人口模型 import numpy as np import matplotlib.pyplot as plt# 初始人口 N0 100 # 人口增长率 r 0.02 # 时间段&#xff08;年&#xff09; t np.linspace(0, 200, 200)# 马尔萨斯人口模型 N N0 * np.exp(r * t)# 绘图 plt.plot(t, N, labelPopulation) plt.…

适用于 Mac 或 MacBook 的最佳数据恢复软件

Apple 设计的电脑可靠且用户友好&#xff0c;但即使是最好的最新款 MacBook硬件也会出现故障。当您的存储出现问题时&#xff0c;数据恢复软件可以帮助您恢复丢失和损坏的文件。 数据丢失的另一个原因是有时会发生令人尴尬的错误。如果您不小心丢弃了所需的文件&#xff0c;然…

《智能物联技术》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《智能物联技术》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《智能物联技术》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;中国电子科技集团公司 主办单位&#xff1a;…

微软的Edge浏览器如何设置兼容模式

微软的Edge浏览器如何设置兼容模式&#xff1f; Microsoft Edge 在浏览部分网站的时候&#xff0c;会被标记为不兼容&#xff0c;会有此网站需要Internet Explorer的提示&#xff0c;虽然可以手动点击在 Microsoft Edge 中继续浏览&#xff0c;但是操作起来相对复杂&#xff0c…

LeetCode 125.验证回文串 C++写法

LeetCode 125.验证回文串 C写法 思路&#x1f914;&#xff1a; 我们不对字符串进行删除&#xff0c;这样效率太低了&#xff0c;所以可以左右开工&#xff0c;下标begin和end遇到不是字母数字字符的就跳过&#xff0c;当两边都是字母就进行比对&#xff0c;一样就继续往后走&a…

ubuntu本地部署llama3大模型

安装大模型 首先需要安装curl&#xff1a; sudo apt install curl 然后安装 ollama&#xff0c;可以去ollama.com复制下载命令&#xff1a; curl -fsSL https://ollama.com/install.sh | sh 然后就是启动ollama服务&#xff1a; ollama serve 出现这个说明已经运行&#xff0c…

PyTorch手写体数字识别实例

MNIST数据集的准备 “HelloWorld”是所有编程语言入门的基础程序&#xff0c;在开始编程学习时&#xff0c;我们打印的第一句话通常就是这个“HelloWorld”。本书也不例外&#xff0c;在深度学习编程中也有其特有的“HelloWorld”&#xff0c;一般就是采用MNIST完成一项特定的…

Java二十三种设计模式-代理模式模式(8/23)

代理模式&#xff1a;为对象访问提供灵活的控制 引言 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一个代替或占位符&#xff0c;以控制对它的访问。 基础知识&#xff0c;java设计模式总体来说设计模式分为三大类&#…

Ant Design Vue中日期选择器快捷选择 presets 用法

ant写文档的纯懒狗 返回的是一个day.js对象 范围选择时可接受一个数组 具体参考 操作 Day.js 话不多说 直接上代码 <a-range-pickerv-model:value"formData.datePick"valueFormat"YYYY-MM-DD HH:mm:ss"showTime:presets"presets"change&quo…

一、C#概述

本文是网页版《C# 12.0 本质论》第一章解读。欲完整跟踪本系列文章&#xff0c;请关注并订阅我的Essential C# 12.0解读专栏。 前言 第一章的内容非常简单&#xff0c;毕竟仅仅是Introducing C#。不过正如《0.前言》所述&#xff0c;《C# 12.0本质论》本身就不是一本零基础的…

【Redis】主从复制分析-基础

1 主从节点运行数据的存储 在主从复制中, 对于主节点, 从节点就是自身的一个客户端, 所以和普通的客户端一样, 会被组织为一个 client 的结构体。 typedef struct client {// 省略 } client;同时无论是从节点, 还是主节点, 在运行中的数据都存放在一个 redisServer 的结构体中…

S71200 - 笔记

1 S71200 0 ProfiNet - 2 PLC编程 01.如何零基础快速上手S7-1200_哔哩哔哩_bilibili 西门子S7-1200PLC编程设计学习视频&#xff0c;从入门开始讲解_哔哩哔哩_bilibili

Facebook在内容创作中的新策略与机会

随着社交媒体的不断发展&#xff0c;内容创作已经成为了平台吸引和留住用户的核心竞争力。Facebook作为全球最大的社交平台之一&#xff0c;不断调整和优化其内容创作策略&#xff0c;以适应用户需求的变化和技术的进步。本文将深入探讨Facebook在内容创作中的新策略与机会&…

【深度学习】yolov8-det目标检测训练,拼接图的分割复原

项目背景 https://blog.csdn.net/x1131230123/article/details/140606459 似乎这个任务是简单的&#xff0c;利用目标检测是否可以完成得好呢? 生成数据集 利用这个代码产生数据集&#xff1a; 为了将标签转换为YOLOv5格式&#xff0c;需要将左上角和右下角的坐标转换为Y…

websocket实现进度条

websocket实现进度条 做一个简易的websocket实现进度条的练习&#xff0c;效果如下&#xff1a; 前端vue3 <template><el-progress type"circle" :percentage"this.progressValue" :status"this.perstatus" /><el-button cli…

【Python的wxauto】快速入门案例:简单操作微信发送消息

使用wxauto库发送消息是一个相对简单的过程。以下是一个详细的文字教程&#xff0c;以及相应的Python代码示例&#xff0c;指导您如何使用wxauto库发送消息。 文字教程&#xff1a;使用wxauto库发送消息 效果展示 步骤1&#xff1a;环境准备 确保您的计算机上安装了Python…

人工智能增强的心电图推导的身体质量指数作为未来心脏代谢疾病预测指标| 文献-基于人工智能(AI base)医学影像研究与疾病诊断

Title 题目 Artificial intelligence-enhancedelectrocardiography derived body massindex as a predictor of futurecardiometabolic disease 人工智能增强的心电图推导的身体质量指数作为未来心脏代谢疾病预测指标 01 文献速递介绍 心电图&#xff08;ECG&#xff09;可…