step6:改用单例模式

文章目录

  • 文章介绍
  • code
    • main.cpp
    • SerialPort.qml
    • SerialPortHandler.h

文章介绍

案例MF改为单例模式
参考之前写过的关于单例模式的文章单例模式1、单例模式2

code

main.cpp

在这里插入图片描述

qmlRegisterSingletonType(“com.example.serialport”, 1, 0, “SerialPortHandler”, SerialPortHandlerGetInstance);

SerialPort.qml

  • 导入模块
    在这里插入图片描述
  • 调用SerialPortHandler类

在这里插入图片描述

SerialPortHandler.h

在这里插入图片描述
在这里插入图片描述

#ifndef SERIALPORTHANDLER_H
#define SERIALPORTHANDLER_H

#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QQmlEngine>
#include <QJSEngine>

class SerialPortHandler : public QObject
{
    Q_OBJECT
    Q_PROPERTY(bool isSerialPortOpen READ isSerialPortOpen NOTIFY serialPortOpenChanged)

public:
    // 获取单例实例
    static SerialPortHandler* getInstance() {
        static SerialPortHandler instance;  // 确保只有一个实例
        return &instance;
    }

    explicit SerialPortHandler(QObject *parent = nullptr);
    ~SerialPortHandler();  // 析构函数

    Q_INVOKABLE void openSerialPort(const QString &portName);  // 打开指定串口
    Q_INVOKABLE void closeSerialPort();  // 关闭串口
    Q_INVOKABLE QStringList getAvailablePorts() const;  // 获取可用串口列表

    bool isSerialPortOpen() const;  // 检查串口是否打开

signals:
    void serialPortOpened();  // 串口打开信号
    void serialPortOpenChanged();  // 串口状态改变信号
    void dataReceived(const QString &data);  // 数据接收信号

private slots:
    void readData();  // 读取数据槽函数

public slots:
    void sendData(const QString &data);  // 发送数据槽函数

private:
    QSerialPort serialPort;  // 串口对象
    bool m_isSerialPortOpen;  // 串口打开状态

    // 禁用拷贝构造函数和赋值操作符
    Q_DISABLE_COPY(SerialPortHandler)
};

// 单例获取函数声明
static QObject* SerialPortHandlerGetInstance(QQmlEngine *engine, QJSEngine *scriptEngine) {
    Q_UNUSED(engine)
    Q_UNUSED(scriptEngine)
    return SerialPortHandler::getInstance();
}

#endif // SERIALPORTHANDLER_H

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++ 设计模式 的课本范例(上)

( 0 ) 这里补充面向对象设计的几个原则&#xff1a; 开闭原则 OCP &#xff1a; 面向增补开放&#xff0c;面向代码修改关闭。其实反映到代码设计上就是类的继承&#xff0c;通过继承与多态&#xff0c;可以不修改原代码&#xff0c;又增加新的类似的功能。 依赖倒置原则 Depen…

JavaSE:多态

向上转型&#xff1a; 先看一段代码&#xff1a; 为何Animal animalnew Dog这个代码不报错。就是因为使用了向上转型&#xff1a;父类引用引用子类对象 向上转型一共有三种方式可以实现向上转型&#xff1a;1.直接赋值&#xff0c;2.通过传参&#xff0c;3.返回值 1.直接赋值…

virtualbox安装win10

等到安装完成 设备下选择安装增强功能

【教程】几种不同的RBF神经网络

本站原创文章&#xff0c;转载请说明来自《老饼讲解-机器学习》www.bbbdata.com 目录 一、经典RBF神经网络1.1.经典径向基神经网络是什么1.2.经典径向基神经网络-代码与示例 二、广义回归神经网络GRNN2.1.广义回归神经网络是什么2.2.广义回归神经网络是什么-代码与示例 三、概率…

Redis 5 种基础数据结构?

Redis 5 种基本数据结构(String、List、Hash、Set、Sorted Set)在面试中经常会被问到&#xff0c;这篇文章我们一起来回顾温习一下。 还有几种比较特殊的数据结构(HyperLogLogs、Bitmap 、Geospatial、Stream)也非常重要&#xff0c;我们后面下次再聊&#xff01; 下面是正文。…

双减期末考试成绩怎么公布?

考试一直是衡量学生学习成果的重要手段。不过&#xff0c;随着"双减"政策的实施&#xff0c;我们就不得不重新审视传统的成绩公布方式。期末考试成绩&#xff0c;这个曾经让无数学生心跳加速的数字&#xff0c;如今该如何以一种更加合理、公正的方式呈现给学生和家长…

广和通 OpenCPU 二次开发(一) —— 串口

广和通 OpenCPU 二次开发&#xff08;一&#xff09; —— 串口 1.port&#xff0c;端口号2.引脚序列号对应芯片引脚图找&#xff0c;也可以对照GPIO功能复用表找3.要复用的pin脚对应的功能mode根据GPIO功能复用表选择 一、核心配置## 标题代码 int port 1; fibo_gpio_mode_s…

力扣SQL50 员工的直属部门 子查询 双重

Problem: 1789. 员工的直属部门 &#x1f468;‍&#x1f3eb; 参考题解 Code select employee_id, department_id from Employee where primary_flag Y # Y 表明是直属部门 or employee_id in (select employee_idfrom Employeegroup by employee_idhaving count(employee…

国外的Claude3.5 Sonnet Artifacts和国内的CodeFlying孰强孰弱?

在Claude 3.5 Sonnet发布后&#xff0c;最受大家关注的问题应该就是它在编写代码能力上的变化。 要知道在Claude3.0发布以来的这几个月就因为它的编写代码能力而一直受到人们的诟病。 那Anthropic这次终于是不负众望&#xff0c;在Claude 3.5 Sonnet中更新了一个叫做Artifact…

ETAS工具导入DEXT生成Dcm及Dem模块(一)

文章目录 前言Cfggen之前的修改ECU关联DcmDslConnectionDiagnostic ProtocolDiagnostic Ecu Instance PropsCommonContributionSetEvent修改communication channel总结前言 诊断模块开发一般是先设计诊断数据库,OEM会释放对应的诊断数据库,如.odx文件或.cdd文件。如果OEM没有…

go~缓存设计配合singleFlight

一个缓存设计&#xff0c;配合go的singleFlight 最开始的设计如下 添加分布式缓存 上线后分布式缓存上涨的流量并不等于下游下降的流量&#xff0c;而是下游下降的流量 * 2&#xff5e;3 究其原因&#xff0c;就是采用了go的singleFlight&#xff0c;假定请求缓存时长10ms&a…

LabVIEW网络开发资源

在LabVIEW开发中&#xff0c;利用网络资源进行学习和查找资料是提高技能和解决问题的重要途径。以下几个国内外优质资源可以帮助开发者获得丰富的技术支持和交流机会&#xff1a; 1. NI Community (NI社区) 简介: National Instruments官方运营的社区&#xff0c;提供丰富的资…

浅谈:冒烟测试

在软件开发的生命周期中&#xff0c;测试阶段是确保产品质量的关键环节。冒烟测试作为软件测试的一种快速而有效的初步验证方法&#xff0c;重要性不言而喻。 冒烟测试源自制造业&#xff0c;尤其是电子行业。当一块电路板被制造出来后&#xff0c;工程师们会首次通电&#xf…

【应用开发二】GPIO操控(输出、输入、中断)

1 操控GPIO方式 控制目录&#xff1a;/sys/class/gpio /sys/class/gpio目录下文件如下图所示&#xff1a; 1.1 gpiochipX目录 功能&#xff1a;当前SoC所包含的所有GPIO控制器 i.mx6ull一共包含5个GPIO控制器&#xff0c;分别为GPIO1~5分别对应gpiochip0、gpiochip32、gpi…

【漏洞复现】用友 GRP-U8 FileUpload 任意文件上传漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

蒙特卡洛法求定积分方

对于连续函数密度函数&#xff0c;求某一个区间的概率时&#xff0c;理论上通过积分获取&#xff0c; 以求曲线围成的面积为例 当我们在[a,b]之间随机取一点x时&#xff0c;它对应的函数值就是f(x)。接下来我们就可以用f(x)*(b-a)来粗略估计曲线下方的面积&#xff0c;也就是我…

Redis主从复制、哨兵以及Cluster集群

1.Redis高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提供…

Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测

Linux 异步 I/O 框架 io_uring 前言Linux I/O 系统调用演进io_uring与 Linux AIO 的不同原理及核心数据结构&#xff1a;SQ/CQ/SQE/CQE带来的好处三种工作模式io_uring 系统调用 API 前言 io_uring 是 2019 年 Linux 5.1 内核首次引入的高性能 异步 I/O 框架&#xff0c;能显著…

003-GeoGebra如何无缝嵌入到PPT里

GeoGebra无缝嵌入到PPT里真是一个头疼的问题&#xff0c;已成功解决&#xff0c;这里记录一下&#xff0c;希望可以帮助到更多人。 注意&#xff0c;后续所有的文章说的PPT都是Offce Power Point, 不要拿着WPS的bug来问我哦&#xff0c;我已经戒WPS了&#xff08;此处表示无奈&…

typescript学习回顾(四)

今天来分享下ts中的类&#xff0c;关于ts中的类的概念&#xff0c;面向对象的一种思想&#xff0c;以及类里面的一些属性成员&#xff0c;一些基础的用法&#xff0c;后面会有一个小练习。 类 基本概念 我的理解&#xff1a;类是编程语言中面向对象的一种思想&#xff0c;一…