QT:单例

news2024/9/21 19:37:27

单例的定义

官方定义:单例是指确保一个类在任何情况下都绝对只有一个实例并提供一个全局访问点。

单例的写法

抓住3点:

  • 构造函数私有化(确保只有一个实例)
  • 提供一个可以获取构造实例的接口(提供唯一的实例)
  • 正常写你需要实现的函数

 举个例子

①就是构造函数私有化,把构造函数放在private

②就是提供一个可以获取实例的接口,这个实例就是私有变量_singleton

③就是正常需要实现的函数,正常咋写就咋写,但最好是独立的且需要多次被使用

用法

在需要使用单例的文件中添加单例的头文件

举个例子,我要在BlockFileTreeView中使用单例中的函数,那么我就在BlockFileTreeView.cpp中添加单例头文件

#include "ResourceTreeViewSingleton.h"

然后再需要调用函数的地方通过单例的init获取实例,然后调用需要使用的函数

filePath = _fileLocalPath + ResourceTreeViewSingleton::init()->getRelativePath(_currentProcessItem,"");
重点就是这句ResourceTreeViewSingleton::init()->getRelativePath(_currentProcessItem,"");

红色部分是获取单例的实例,黄色部分就是调用单例的函数。

单例代码

.h

#ifndef RESOURCETREEVIEWSINGLETON_H
#define RESOURCETREEVIEWSINGLETON_H

#include <QSharedPointer>
#include <QMutex>
#include <QStandardItem>
#include <QFileInfo>
class ResourceTreeViewSingleton: public QObject
{
    Q_OBJECT
public:
    ~ResourceTreeViewSingleton() override;
    static QSharedPointer<ResourceTreeViewSingleton>& init();
    static void doDeleteLater(ResourceTreeViewSingleton *obj);
    static void releaseThis();

    // 单例类中需要实现的函数
    bool isDirVisible(QString text);
    QString changeUnit(const qint64 &size);
    QString changeQStringSize(const QString &size);
    bool isFile(QStandardItem * item);
    QString getRelativePath(QStandardItem *item, QString relativePath);
    QList<QStandardItem *> queryStandardItem(QStandardItem *topItem);
    QList<QStandardItem *> queryStandardItemPush(QStandardItem *topItem);
    bool saveFile(const QString &filePath, const QString &text);
    QString getDefaultDeviceName(const QStandardItem *item, const QFileInfo &fileInfo);
private:
    explicit ResourceTreeViewSingleton(QObject *parent = nullptr);
    static QSharedPointer<ResourceTreeViewSingleton > _singleton;
    static QMutex _mutex;
};

#endif // RESOURCETREEVIEWSINGLETON_H

.cpp

#include "ResourceTreeViewSingleton.h"
#include <QMutexLocker>
#include <QStandardItem>
QMutex ResourceTreeViewSingleton::_mutex;
QSharedPointer<ResourceTreeViewSingleton> ResourceTreeViewSingleton::_singleton;

ResourceTreeViewSingleton::ResourceTreeViewSingleton(QObject *parent): QObject(parent)
{

}

ResourceTreeViewSingleton::~ResourceTreeViewSingleton()
{

}

void ResourceTreeViewSingleton::doDeleteLater(ResourceTreeViewSingleton *obj)
{
    obj->deleteLater();
}
void ResourceTreeViewSingleton::releaseThis()
{
    _singleton.clear();
}

QSharedPointer<ResourceTreeViewSingleton> &ResourceTreeViewSingleton::init()
{
    //初始化决定了它所在的线程
    if (_singleton.isNull()){
        QMutexLocker mutexLocker(&_mutex);
        if (_singleton.isNull()){
            //发现 doDeleteLater 会崩溃
            _singleton = QSharedPointer<ResourceTreeViewSingleton>(new ResourceTreeViewSingleton()/*,doDeleteLater*/);
        }
    }
    return _singleton;
}

//下面写需要实现的正常函数

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

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

相关文章

在 sealos 上使用 redisinsight 完美管理 redis

先起一个 redis 集群&#xff0c;在 sealos 上可以点点鼠标就搞定&#xff1a; 简单两步&#xff0c;redis 集群搞定。 再启动 RedisInsight, 是一个 redis 的可视化管理工具。 就可以看到部署后的地址了。进去之后填写 redis 的链接信息即可&#xff1a; 链接信息在数据库的…

已解决 ValueError: Data cardinality is ambiguous 问题

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

网络字节序与主机字节序

字节序区分 多字节的数值在内存中高低位的排列方式会影响所表示的数值处理方式和显示。字节序以字节为基本单位&#xff0c;表示不同字节的存储顺序。 从存储顺序上区分&#xff0c;可分为大端字节序和小端字节序。从处理上区分&#xff0c;可区分为网络字节序和主机字节序。…

YY9702.102-2021 医疗设备EMC检测知识

一&#xff1a;CE&#xff08;传导发射试验&#xff09; 在做医疗器械机器EMC实验时&#xff0c;根据YY9706.102-2021的要求&#xff0c;按照图一流程先对表一进行填写。 设备分类和分组&#xff1a;《GB4824-2019》 根据以上对ME设备进行分组和分类&#xff0c;例如血透机属于…

Java课程设计个人博客

目录 引言&#xff1a;在此说明在本次课设过程中所遇到的困难&#xff01; 一、项目搭建的问题 Q1:Web项目应用啥么编译器编写&#xff1f; Q2:如何创建Web项目(MAVEN)&#xff1f; Q3:Tomcat服务器开头控制台显示乱码如何解决&#xff1f; Q4:Tomcat服务器怎么设置项目的…

gem5学习(9):构建gem5——Building gem5

目录 一、Requirements for gem5 二、Getting the code 三、Your first gem5 build 1、gem5 binary types 四、Common errors 1、gcc版本过低 2、使用非默认版本的python 3、未安装M4宏处理器 4、Protobuf版本过低 前面的gem5学习&#xff08;3&#xff09;—&#xf…

Java面试高招:程序员如何在面试中脱颖而出

Java面试高招&#xff1a;程序员如何在面试中脱颖而出 《Java面试高招&#xff1a;程序员如何在面试中脱颖而出》摘要引言面试经历面试失败的反思 面试技巧侦探式的问题解决无敌铁金刚的坚定决心 参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1…

安全典型配置(六)配置IPSG限制非法主机访问内网案例(静态绑定)

相关文章学习&#xff1a; 安全典型配置&#xff08;一&#xff09;使用ACL限制FTP访问权限案例 安全典型配置&#xff08;二&#xff09;使用ACL限制用户在特定时间访问特定服务器的权限案例 安全典型配置&#xff08;三&#xff09;使用ACL禁止特定用户上网案例安全典型配置…

产品经理如何做好需求评审?掌握五大关键要素

随着产品经理职位的日益重要&#xff0c;对产品需求的评审也越来越重要。一个成功的产品经理需要不仅仅是拥有好的产品理念和市场分析能力&#xff0c;更需要拥有好的需求评审能力&#xff0c;这样才能够确保产品能够顺利开发&#xff0c;最终成功上市。那么&#xff0c;产品经…

【系统高级-环境变量】path配置一整行,而不是列表

这是列表编辑方便。但是不知道为什么变成一行&#xff0c;非常的令人抓狂&#xff0c;经过研究发现&#xff0c;第一个环境变量必须为C:\Windows\system32 开头才可以 文章如下 修改环境变量中的一行变成列表形式_环境变量编辑不是列表-CSDN博客

WiFi6工业网关能为工业物联网带来哪些改进?

WiFi 6&#xff08; 802.11ax&#xff09;比其前身WiFi 5&#xff08;802.11ac&#xff09;带来了多项改进&#xff0c;例如更快的通信速率、更大的带宽容量、在多设备连入时更稳定的性能、更大的链接范围、增强的安全性以及更好地支持物联网工作负载等&#xff0c;本篇就为大家…

实战:使用docker容器化服务与文件挂载-2

接着上文&#xff0c;演示Elasticsearch 和 Kibana 的安装&#xff0c;并讲解文件挂载 Elasticsearch of Docker &#xff08;Kibana&#xff09; 1、Elasticsearch 安装 ElasticSearch 使用 Docker 安装&#xff1a;https://www.yuque.com/zhangshuaiyin/guli-mall/dwrp5b 1.…

Linux第20步_在虚拟机上安装“Visual Studio Code”

1、双击windows系统桌面上的“FileZilla Client.exe”&#xff0c;打开FTP客户端&#xff0c;点击03软件下的Visual Studio Code&#xff0c;发现code_1.50.1-1602600906_amd64。 2、点击“文件”&#xff0c;然后点击“站点管理器”&#xff0c;见下图操作&#xff1a; 3、点…

猫头虎分享已解决Bug || Go Error: cannot use str (type string) as type int in assignment

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

Python将Labelme文件的真实框和预测框绘制到图片上

Python将Labelme文件的真实框和预测框绘制到图片上 前言前提条件相关介绍实验环境Python将Labelme文件的标注信息绘制到图片上代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专…

这些专利知识你知道吗?

专利作为一种重要的知识产权保护形式。专利不仅成为了企业核心竞争力的重要组成部分&#xff0c;也成为了国家创新发展的重要支撑。 专利是指国家专利主管机关授予发明创造申请人的一种专有权&#xff0c;这种专有权具有独占性、排他性和法律强制性&#xff0c;能够为持有者带来…

通过盲对抗性扰动实时击败基于DNN的流量分析系统

文章信息 论文题目&#xff1a;Defeating DNN-Based Traffic Analysis Systems in Real-Time With Blind Adversarial Perturbations 期刊&#xff08;会议&#xff09;&#xff1a;30th USENIX Security Symposium 时间&#xff1a;2021 级别&#xff1a;CCF A 文章链接&…

基于sigma-delta和MASHIII调制器的频率合成器simulink建模与仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 Sigma-Delta调制器原理 4.2 数学模型 4.3 噪声整形 4.4 MASH III调制器原理 4.5 基于Sigma-Delta和MASH III的频率合成器 5.算法完整程序工程 1.算法运行效果图预览 其误差当系统进…

已解决 Java Error: java.lang.UnsupportedOperationException 问题

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

Linux学习记录——삽심칠 传输层TCP协议(2)

文章目录 1、滑动窗口2、拥塞控制3、延迟应答4、捎带应答5、总结TCP可靠性和性能提高6、面向字节流7、粘包问题8、异常情况9、全连接、半连接 上一篇是传输层TCP协议&#xff08;1&#xff09;。本篇默认读者已经清楚TCP报头各个部分、可靠性和握手挥手的含义。 有时候会把客户…