Qt Remote Objects (QtRO) 笔记

简介

Qt Remote Objects (QtRO) 是 Qt 的一个进程间通信模块。

术语

Source 是指提供服务或提供功能供其他程序使用的对象,是 RPC 中的被调用端。

Replica 是指 Source 对象的代理对象,用于 RPC 中的调用端,对 Replica 的调用请求将被转发给 Source 对象。

示例1:Direct Connection using a Static Source

创建接口定义文件

创建接口定义文件 simpleswitch.rep :

复制代码
class SimpleSwitch
{
  PROP(bool currState=false);
  SLOT(server_slot(bool clientState));
};

修改 .pro 文件

复制代码
// 引入 QtRO 模块
QT += remoteobjects
// 引入接口定义文件
REPC_SOURCE = simpleswitch.rep

Qt 将使用 repc 工具编译该接口定义文件生成 C++ 代码。

生成的文件:

  • rep_simpleswitch_source.h
  • rep_simpleswitch_replica.h

rep_simpleswitch_source.h 用于 Source 端,需要继承其中的接口类,实现其中的虚函数。

rep_simpleswitch_replica.h 用于 Replica 端,是 Source 对象的代理对象。

Source 端

实现 rep_simpleswitch_source.h 中接口类的虚函数,作为服务对象。

创建服务对象,并设置为可远程访问:

c++ 复制代码
SimpleSwitch srcSwitch; // create simple switch

QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:replica"))); // create host node without Registry
srcNode.enableRemoting(&srcSwitch); // enable remoting/Sharing

Replica 端

连接到服务端:

c++ 复制代码
QSharedPointer<SimpleSwitchReplica> ptr;

QRemoteObjectNode repNode; // create remote object node
repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node

ptr.reset(repNode.acquire<SimpleSwitchReplica>()); // acquire replica of source from host node

获取到 SimpleSwitchReplica 对象指针之后,就可以像使用普通 Qt 对象那样使用该对象,该对象拥有和服务对象相同的接口函数(信号函数、槽函数等)。

客户端也可以不使用 rep_simpleswitch_replica.h ,而是使用 QRemoteObjectDynamicReplica 类来动态地与服务对象交互。

示例2:Connections to Remote Nodes using a Registry

第一个示例是采用直接连接的方式,即代理对象直接连接到服务对象。

另一种方式是使用注册中心,此时服务对象将自己注册到服务中心,客户端连接到注册中心,然后获取指定服务对象的代理对象。

服务端:

c++ 复制代码
// 注册中心,可以在一个单独的进程中
QRemoteObjectRegistryHost regNode(QUrl(QStringLiteral("local:registry"))); // create node that hosts registy

// 服务对象
SimpleSwitch srcSwitch; // create simple switch

// 在注册中心上注册服务对象
QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:replica")), QUrl(QStringLiteral("local:registry"))); // create node that will host source and connect to registry
srcNode.enableRemoting(&srcSwitch); // enable remoting of source object

客户端:

c++ 复制代码
QSharedPointer<SimpleSwitchReplica> ptr;

QRemoteObjectNode repNode(QUrl(QStringLiteral("local:registry")));

ptr.reset(repNode.acquire<SimpleSwitchReplica>()); // acquire replica of source from host node
相关推荐
做cv的小昊28 分钟前
【TJU】研究生应用统计学课程笔记(8)——第四章 线性模型(4.1 一元线性回归分析)
笔记·线性代数·算法·数学建模·回归·线性回归·概率论
楼田莉子1 小时前
Linux网络:NAT_代理
linux·运维·服务器·开发语言·c++·后端
我命由我123451 小时前
程序员的心理学学习笔记 - 空杯心态
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
南境十里·墨染春水1 小时前
C++日志 2——实现单线程日志系统
java·jvm·c++
zh_xuan1 小时前
api测试工具添加历史记录功能
c++·libcurl·duilib
晓梦林1 小时前
3170靶场学习笔记
笔记·学习
ZC跨境爬虫2 小时前
跟着 MDN 学 HTML day_17:媒体与 Web Audio API 自动播放指南——策略、检测与最佳实践
前端·笔记·ui·html·音视频·媒体
休息一下接着来2 小时前
C++ 固定容量环形队列实现
c++·算法
ErizJ2 小时前
Redis|学习笔记
redis·笔记·学习
Amazing_Cacao2 小时前
CFCA精品可可饮品认证课程高级压力测试:在极端液态变量中,捍卫精品巧克力品质的稳定复现法则
笔记