2024-04-02 在使用QtRemoteObject 过程中遇到的问题记录

前言

QtRemoteObject 的使用分为静态和动态使用,静态使用需要定义rep文件,相当于通信协议,保证源端和节点端类型的统一。
这些可以参考这两文章:

https://zhuanlan.zhihu.com/p/36501814

https://zhuanlan.zhihu.com/p/37108172

以及Qt官方文档

一、我期望的使用需求?

在源端,我有一个mode,mode里存放的是基于QObject实现的子类,我希望将这个mode通过QtRO共享出去。节点端只使用qml界面,不用c++,所以直接使用动态方式即可
在这里插入图片描述

  • mode内是基于QObject实现的类
  • Host共享mode
  • Node动态获取mode
  • Node节点端直接获取数据
  • 整个过程不需要rep文件
  • Node端为另外一套程序,不引用Host端代码

二、实现过程遇到的部里

  • 共享mdoe时,必须要
QVector<int> roles;
roles << Qt::UserRole + 1 << Qt::UserRole + 2 << Qt::UserRole + 3 ;
m_host->enableRemoting(&m_dataModel, QStringLiteral("xxxx"), roles);
  • node端 使用 m_replical = m_node.acquireModel(name); 即可获取到mode,将 获取结果,使用c++与qml通讯方式即可共享给qml,如 Q_PROPERTY(QAbstractItemModelReplica *replical READ replical NOTIFY replicalChanged)
  • mdoe内保存的可以是自定义类型,也可以是qt官方提供的数据类型,如QString,Qcolor,QPoint,QSize等等,如果是官方类型,node端即可实现开箱即用。如果是自定义类型,就比较麻烦,通过多次测试发现,自定义类型不能基于QObject实现
class Actor
{
    Q_GADGET
    Q_PROPERTY(QString name READ name WRITE setName)
public:
    Actor() {}
    Actor(const QString &name)
        : m_name(name)
    {}
    QString name() const { return m_name; }
    void setName(const QString &name) { m_name = name; }

    friend QDataStream &operator<<(QDataStream &out, const Actor &actor)
    {
        out << actor.m_name;
        return out;
    }
    friend QDataStream &operator>>(QDataStream &in, Actor &actor)
    {
        in >> actor.m_name;
        return in;
    }

private:
    QString m_name;
};
Q_DECLARE_METATYPE(Actor)

这样的类型可以存放于mode中,并将mode通过QtRO发送给Node端,但是,Node端qml是无法访问到这个类型里name属性,因为Node端不认识Actor这个类型,解决办法就是Node端引入Actor这个类型所在文件,使用qmlRegisterType<Actor>("Actor", 1, 0, "Actor"); 来告诉qml有这个类型,这样qml端即可调用到Actor内部的属性。。但是这有围背我本来的期望,我不希望Node端再引入host端的代码。

如果我们使用的类型是基于QObject的,就无法实现动态调用,如:

class ActorO : public QObject
{
    Q_OBJECT
public:
    ActorO() {}
    ActorO(const ActorO &actor)
        : m_name(actor.m_name)
    {}
    ActorO &operator=(const ActorO &other)
    {
        m_name = other.m_name;
        return *this;
    }

    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
    QString name() const { return m_name; }
    void setName(const QString &name)
    {
        m_name = name;
        emit nameChanged();
    }
signals:
    void nameChanged();

private:
    QString m_name;
};

这种用法又现了另外一个问题,它可以保存在Mode中,也可以共享出去,但是Node端还是不认识,由于共享传输使用的是先将类型转为QVariant,再将QVariant序列化,Node端反序列化,再转为QVariant.不管Node端有无引入类型,都无法实现
如果Mode中保存类型指针,那QtRO无法传递出去,但如果使用普通对象,由于类型是基于QObject的,QObject禁用拷贝的,不法拷贝到QVariant中,因此进入了个死循环。我没办法实现将已有项目中的mode(保存有基于QObject实现的类型)通过QrRO动态发送。

  • 最后解决方法,写一个专用的mode,在原有mode的基础上添加,通过roleNames 来返回具体属性,如:
    QHash<int, QByteArray> roleNames() const override
{
    static QHash<int, QByteArray> roles;
    roles[objectname] = "objectname";
    roles[object] = "object";
    roles[object_pointer] = "object_pointer";
    roles[object_name] = "object_name"; // 可以获取mode内元素内部属性name的值
    roles[object_id] = "object_id";// 可以获取mode内元素内部属性id的值
    return roles;
}
  • 可能有其它方法,但暂时没有找到
  • 测试代码,代码需要自行研究https://github.com/tianxiaofan/RemoteObjectTest
  • 欢迎大家共同交流

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

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

相关文章

校园圈子系统-论坛,跑腿,地图找伴,二手市场,语音交友,APP小程序H5三端源码交付,支持二开!

2024年最新版推荐一个论坛社区系统 /社区论坛小程序/商城论坛小程序/源码。 带热门,带算法推荐 &#xff0c;低成本上线的&#xff0c;论坛社区小程序源码强大售后&#xff0c;持续更新 功能&#xff1a;小程序授权登陆&#xff0c;支持app双端&#xff0c;小程序&#xff0c;…

qt5-入门-自定义委托-简单例子

参考&#xff1a; Qt 自定义委托_w3cschool https://www.w3cschool.cn/learnroadqt/ov8h1j4z.html C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt 5.12 理论知识 Qt的model/view架构中&#xff0c;view只是…

FastAPI Web框架教程 第14章 部署

14-1 在Linux上安装Python 【环境】 腾讯云服务器 Centos 8 【安装方式】 源码编译安装 安装步骤&#xff1a; 第1步&#xff1a;更新yum源 cd /etc/yum.repos.d/ sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-* sed -i s|#baseurlhttp://mirror.centos.…

RESTful的优点

优点 1.通过url对资源定位&#xff0c;语义清晰&#xff1b; 2.通过HTTP谓词表示不同的操作&#xff0c;接口自描述&#xff1b; 3.可以对GET、PUT、DELETE请求重试&#xff08;幂等的&#xff09;&#xff1b; 4.可以对GET请求做缓存&#xff1b; 5.通过HTTP状态码反映服务器端…

【数据结构】AVL 树

文章目录 1. AVL 树的概念2. AVL 树节点的定义3. AVL 树的插入4. AVL 树的旋转5. AVL 树的验证6. AVL 树的删除7. AVL 树的性能 前面对 map / multimap / set / multiset 进行了简单的介绍【C】map & set&#xff0c;在其文档介绍中发现&#xff0c;这几个容器有个共同点是…

Java面试必问题24:线程池的拒绝策略有哪些 synchronized 和 lock 的区别 (重点)

以上列出的是Java线程池中常见的拒绝策略&#xff0c;具体可以根据实际情况选择合适的拒绝策略&#xff0c;也可以自定义实现RejectedExecutionHandler接口来定义自己的拒绝策略。默认的拒绝策略是AbortPolicy&#xff0c;即直接抛出异常。 最简回答&#xff1a;线程池的拒绝策…

6000000IOPS!FASS×kunpeng920全新突破

实测数据详见下文 网络环境 前端和后端网均采用100GE网络&#xff0c;管理网采用1Gbps以太网。 前端网和后端网通过不同网段隔离&#xff0c;与管理网物理隔离。 软硬件配置 存储端配置&#xff1a; 客户端配置&#xff1a; 软件配置&#xff1a; 存储集群配置&#xff1a; …

EasyExcel 复杂表头的导出(动态表头和静态表头)

问题&#xff1a;如图&#xff0c;1部分的表头是动态的根据日期变化&#xff0c;2部分是数据库对应的字段&#xff0c;静态不变的&#xff1b; 解决方案&#xff1a;如果不看1的部分&#xff0c;2部分内容可以根据实体类注解的方式导出&#xff0c;那么我们是不是可以先将动态表…

选精益制造咨询公司,牢记这几点,轻松避开陷阱!

众所周知&#xff0c;选择一家合适的精益制造咨询公司&#xff0c;可以帮助企业实现转型升级&#xff0c;提升生产效率和市场竞争力。然而&#xff0c;市场上的咨询公司众多&#xff0c;如何选择一家真正专业、有实力的公司&#xff0c;避免踩坑呢&#xff1f; 一、看准公司背景…

MCU友好过渡MPU,米尔基于STM32MP135开发板裸机开发应用笔记

以前微处理器&#xff08;MPU&#xff09;与微控制器&#xff08;MCU&#xff09;是截然不同的两种设备&#xff0c;MPU支持丰富的软件系统&#xff0c;如Linux和相关的软件堆栈&#xff0c;而MCU通常将专注于裸机和RTOS。近年来&#xff0c;随着MCU的性能越来越高&#xff0c;…

前端二维码生成工具小程序:构建营销神器的技术解析

摘要&#xff1a; 随着数字化营销的不断深入&#xff0c;二维码作为一种快速、便捷的信息传递方式&#xff0c;已经广泛应用于各个领域。本文旨在探讨如何通过前端技术构建一个功能丰富、操作简便的二维码生成工具小程序&#xff0c;为企业和个人提供高效的营销支持。 一、引言…

数字化助力乡村振兴:数字乡村展现新活力

目录 一、数字乡村的概念与内涵 二、数字化助力乡村振兴的具体表现 1、促进农村产业升级 2、提升农民生活质量 3、优化农村治理体系 三、数字乡村展现的新活力 1、创新发展模式的活力 2、激发农民内生动力的活力 3、提升乡村整体形象的活力 四、数字乡村发展面临的挑…

记一次Cannot deploy POJO class [xxx$$EnhancerBySpringCGLIB$$xxx]的错误

最近项目上需要使用websocket做服务端&#xff0c;那好说啊&#xff0c;直接springboot集成的websocket 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><versi…

Linux_进程通信_管道_system V共享内存_6

文章目录 一、进程通信分类二、管道1.什么是管道1.原理2.管道的特点 2.匿名管道3.命名管道1.创建命名管道文件 - mkfifo (命令)2.创建命名管道文件 - mkfifo (函数) 三、system V共享内存1.原理2.共享内存函数1.fotk2.shmget1.如何知道有哪些IPC资源 - ipcs &#xff08;命令&a…

k8s笔记28--快速在ubuntu上基于二进制和源码安装containerd

k8s笔记28--快速在ubuntu上基于二进制和源码安装containerd 介绍containerd 安装方法二进制文件安装源码构建安装 注意事项说明 介绍 Containerd是一个工业标准的容器运行时&#xff0c;它强调简单、健壮和可移植性。它可作为Linux和Windows的守护进程&#xff0c;能管理主机系…

Day78:服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE漏洞

目录 前置知识 数据库应用-Redis-未授权访问&CVE漏洞 未授权访问&#xff1a;CNVD-2015-07557 未授权访问-CNVD-2019-21763 未授权访问-沙箱绕过RCE-CVE-2022-0543 数据库应用-Couchdb-未授权越权&CVE漏洞 Couchdb 垂直权限绕过&#xff08;CVE-2017-12635&…

怎么倒放视频教程?3个简单易行方法分享

怎么倒放视频教程&#xff1f;视频倒放是一种创意性的视频编辑方式&#xff0c;通过倒序播放视频内容&#xff0c;可以为观众带来全新的视觉体验。无论是为了制作搞笑视频&#xff0c;还是为了创作具有艺术感的短片&#xff0c;倒放视频都是一个非常实用的技巧。同时&#xff0…

数学矩阵(详解)

矩阵乘法 知阵乘法是《线性代数》中的基础内容&#xff0c;但在考察数学的算法题中也会出现。 本节我们学习基础的矩阵乘法规则。 每个矩阵会有一个行数和一个列数&#xff0c;只有当相乘的两个矩阵的左矩阵的列数等于右矩阵的行数 时&#xff0c;才能相乘&#xff0c;否则不允…

【计算机毕业设计】黄河交通学院教学质量评价系统的设计与实现(付系统源码)

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

跑步用什么运动耳机?推荐几款跑步时超好用的运动耳机

跑步健身成为了很多都市白领喜欢的运动方式之一&#xff0c;而为专业运动健身领域设计的运动耳机&#xff0c;近年来也受到了越来越多运动爱好者和数码爱好者的关注。相比于传统蓝牙耳机&#xff0c;运动耳机在运动过程中带给用户更舒适和安全的使用体验&#xff0c;因此也受到…