Qt 之 信号参数为QSharedPointer 智能指针类型

2023-10-26

智能指针作为信号参数

/*! connect a module to the event bus
*/
Q_DECLARE_METATYPE( QSharedPointer<GitlEvent> )
bool GitlEventBus::registerModule(GitlModuleDelegate* pcModule)
{    
    qRegisterMetaType< QSharedPointer<GitlEvent> >("QSharedPointer<GitlEvent>");
    connect(this,     SIGNAL(eventTriggered(QSharedPointer<GitlEvent>) ),
            pcModule, SLOT  (detonate      (QSharedPointer<GitlEvent>) ),
            Qt::AutoConnection );

    return true;
}

/*! send event to event bus
*/
void GitlEventBus::post(const GitlEvent& rcEvt) const
{    
    QSharedPointer<GitlEvent> pcEvtCopy( rcEvt.clone() );

    /// notify modules
    emit eventTriggered(pcEvtCopy);
}

当我第一次看到这么用的时候,是一脸懵逼的。

qt中的信号的入参的类型,必须为 meta type,即元类型。即能够让moc识别的类型。
将该智能指针 注册为 元类型了。这样在信号中,就能够使用该智能指针的类型了

再谈QSharedPointer

  • 一个共享指针, 实现的是引用计数型的智能指针
  • 可以被自由地拷贝和复制,在任意的地方共享它,所以QSharedPointer也可以用作容器元素, 及用作QMap的元素,但不能用作key,QSharedPointer与QMap混合使用的注意事项
  • 计数型指针,在内部QSharedPointer对拥有的内存资源进行引用计数,比如有3个QSharePointer同时指向一个内存资源,那么就计数3, 直到引用计数下降到0,那么就自动去释放内存。
  • QSharedPointer是线程安全的,但是QSharedPointer指向的内存区域可不一定是线程安全的,所以过个线程同时修改QSharedPointer指向的数据时,还是应该要考虑加锁

Demo 1

参考Demo

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QSharedPointer>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE


class Student : public QObject
{
    Q_OBJECT;
public:
    Student(QObject *parent = nullptr);

    ~Student();

};

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    QSharedPointer<Student> m_pStudent;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    qDebug()<<__FUNCTION__;
    m_pStudent = QSharedPointer<Student>(new Student(this)); //m_pStudent = QSharedPointer<Student>(new Student());

}

Widget::~Widget()
{
    qDebug()<<__FUNCTION__;
    delete ui;
}


Student::Student(QObject *parent)
{
    qDebug() << __FUNCTION__;
}

Student::~Student()
{
    qDebug() << __FUNCTION__;
}

关闭窗口时,输出:

Widget
Student
~Widget
~Student

Demo 2

Qt QPointer和 QSharedPointer使用实例
该例子更好的说明了在QSharedPointer 在资源耗尽时,如何自动调用对象的析构函数。

  • Person.h
class Person :  public QObject
{
    Q_OBJECT
public:
    Person(const QString &name, QObject *parent = nullptr);
    virtual ~Person();
    QString name() const;
    void setName(const QString &name);
 
private:
    QString m_name; // 名字
};
  • Person.cpp
Person::Person(const QString &name, QObject *parent) : QObject(parent)
{
    m_name = name;
    qDebug() << "create a person: " << m_name;
}
 
 
Person::~Person()
{
    qDebug() << "delete a person: " << m_name;
}
 
QString Person::name() const
{
    return m_name;
}
 
void Person::setName(const QString &name)
{
    m_name = name;
}
  • Window.h
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
    QList<QPointer<Person>> m_persons;
    QSharedPointer<Person> m_person;
 
};
  • Window.cpp

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    qDebug() << m_person;
    m_persons.append(new Person("person1"));
    m_persons.append(new Person("person2"));
 
 
    QPointer<Person> tmp = new Person("tmp");
    // need delelet tmp
    delete tmp;
    QSharedPointer<Person> sharedPerson(new Person("sharedPerson"));
    m_person = sharedPerson;
}
 
MainWindow::~MainWindow()
{
    qDebug("call ~Mainwindow");
    // 释放拥有的 children
    qDeleteAll(m_persons);
    m_persons.clear();
    // m_person 被释放,这就是智能指针
 
}
  • output
QSharedPointer(QObject(0x0))
create a person:  "person1"
create a person:  "person2"
create a person:  "tmp"
delete a person:  "tmp"
create a person:  "sharedPerson"
call ~Mainwindow
delete a person:  "person1"
delete a person:  "person2"
delete a person:  "sharedPerson"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 之 信号参数为QSharedPointer 智能指针类型 的相关文章

随机推荐

  • JBPM工作流管理例子

    工作中要用到JBPM写工作流 自习的时候找到一篇较好的文章 贴过来共享下 在某一公司中 部门员工要休假的话需要部门主管的批准 如果休假天数大于10天的话 在部门主管的同意后 还必须上级主管批准 如果是部门主管要休假只要上级主管批准即可 在休
  • For input string: “ “

    For input string 如果出现这样的异常报错 是指的数据转换时出错 比如字符串转整数 解决方法 去检查前端代码中 相应的值的value 有没有多了空格 删去即可 因为本身就是引用的一个int变量的值 加了一个空格后反而变成了字符
  • EI会议论文的检索报告怎么开?

    根据Engineering Village数据库 可以通过检索确定会议论文是否被EI收录 并可开具检索报告 EI检索覆盖了EI期刊和EI会议等资源 要开具EI会议论文检索报告 先是要进行查询 确保能查到后才可以开具 查询方式如下 直接查询
  • python自动导入包_【pycharm常用设置】自动导入包+自动生成文件头注释

    一 自动导入包设置 首先确保pycharm中设置 File Settings General Auto Import Python Show import popup 导入包是alt enter 键组合 如果弹出下拉菜单选项 说明缺少依赖
  • C语言-队列

    队列是一种特殊的线性表 特殊之处在于它只允许在表的前端 front 进行删除操作 而在表的后端 rear 进行插入操作 和栈一样 队列是一种操作受限制的线性表 进行插入操作的端称为队尾 进行删除操作的端称为队头 队列的特性 先进先出 后进后
  • Windows系统漏洞之5次Shift漏洞启动计算机

    一 原理知识 当我们使用计算机时 连续按下5次shift键会弹出一个程序 程序名称为 esthc exe 其路径为 c windows system32 sethc exe 该系统漏洞由于部分Win7及Win10在未进入系统时 可以通过连续
  • “基于医疗知识图谱的问答系统”代码解析(二)

    基于医疗知识图谱的问答系统 代码解析 二 question classifier py 问题分类器代码解析 基于知识医疗图谱的问答系统 代码解析 一 基于医疗知识图谱的问答系统 代码解析 三 基于医疗知识图谱的问答系统 代码解析 四 基于医
  • docker部署Portainer

    一 Portainer概述 Portainer可以在Docker上运行 而且部署起来非常简单 Portainer是Docker的图形化管理工具 提供状态显示面板 应用模板快速部署 容器镜像网络数据卷的基本操作 包括上传下载镜像 创建容器等操
  • unity 手机上获取手指触摸位置_Unity 操作检测的各种实现#2手机端 - 触屏与手势...

    写在前面 继续填坑了 这次是讲手机端 电脑端 按我跳转 键盘按键控制 上文内容 鼠标点击控制 上文内容 手机端 触屏控制 本文内容 手势控制 本文内容 重力控制 下文内容 陀螺仪控制 下文内容 本文的限制 接上文 本文主要讲在手机检查操作的
  • JavaScript 实现 -- 选择排序

    文章目录 选择排序 原理 代码实现 时间复杂度和稳定性 选择排序 选择排序是一种简单直观的排序算法 原理 第一次从待排序的数据元素中选出最小 或最大 的一个元素 存放在序列的起始位置 然后再从剩余的未排序元素中寻找到最小 大 元素 然后放到
  • python传奇自动打怪脚本_传奇自动刷怪脚本,节省服务器资源

    传奇自动刷怪脚本 节省服务器资源 人到怪到 人走怪没 节省服务器资源哦 main if checkhum d716 1 checkmonmap d716 20 act goto exit elseact goto shuaguai shua
  • C# 基本语法 char数据类型

    参见 Visual C 程序设计基础教程 P21 字符数据类型char用来处理Unicode字符 Unicode是16位字符 char变量以无符号16位字符 2字节 数字的形式存储 取值范围为0到65535 每一个数字代表一个Unicode
  • 二元回归模型matlab代码,多元线性回归Matlab代码

    多元线性回归 b 回归系数 bint 回归系数的置信度为95 的置信区间 r 残差 rint 各残差的置信区间 stats 用于检验回归模型的统计量 有四个数值 相关系数R 2 F值 与F对应的概率p 误差方差 相关系数R 2越接近1 说明
  • 标题:SDXL0.9技术详解:图像生成的新高度

    摘要 本文首先概述了图像生成模型SDXL0 9的特点 它相较早期模型显著提高了参数量级 采用云计算资源进行训练 进行知识图谱预训练以及优化了模型结构 文章然后介绍了SDXL0 9在图像质量 生成速度 语义一致性等指标上的进步 在技术原理上
  • excel快速填充并与上面的单元格内容一致(想要的结果如下图)

    1 选中单元格 2 按F5 点击 定位条件 再点击 空值 3 输入 上一个单元格 本例中就是 A1 4 Ctrl Enter 在这里插入图片描述
  • dedecms后台修改“系统基本参数”无效

    安装完dedecms的一些网站模板后 还原备份数据 系统基本参数也将会自动还原 能在 系统设置 下的 系统基本参数 里看到 但是 我遇到的情况是 无论怎么在系统基本参数里修改内容 更新系统缓存 都没能生效 后来通过直接修改代码实现 方法如下
  • 2020-03-05T06:26:07.000+0000

    JAVA JSON传输过程中时间问题 2020 03 05T06 26 07 000 0000转换成正常格式 2020 03 05 14 28 39 SimpleDateFormat sdf new SimpleDateFormat yyy
  • c语言比double精度更高的数据类型_数制与数据类型

    了解数制的分类 熟悉数据类型的分类 掌握整型数据类型的使用方法 掌握浮点型数据类型的使用方法 掌握字符型数据类型的使用方法 掌握不同数据类型之间的转化规则 掌握使用typedef定义类型的方法 二进制 八进制 十六进制 数制间的转换 二进制
  • SPI基础概念

    文章目录 目的 物理接线 极性和相位 信号时序 总结 目的 SPI Serial Perripheral Interface 是一种非常常用的全双工接口 这个接口在非常简单的机制下达到了比较高的通讯速度 比它通讯速度更高的常见的要不是并口
  • Qt 之 信号参数为QSharedPointer 智能指针类型

    文章目录 智能指针作为信号参数 再谈QSharedPointer Demo 1 Demo 2 智能指针作为信号参数 connect a module to the event bus Q DECLARE METATYPE QSharedPo