Qt Remote Objects

远程对象概念

QtRO (Qt Remote Objects) 是为 Qt 开发的 IPC (进程间通信) 模块。此模块扩展了 Qt 的现有功能,使进程 (或计算机) 之间能够轻松交换信息。

Qt 使这种信息能够交换的关键特征之一是对象 API (由其特性、信号及槽定义) 与该 API 实现之间的区别。QtRO 的目的是满足期望 API,即使真实 QObject 在不同进程中。称为槽的对象复本 ( 复本 在 QtRO) 会被转发给真实对象 ( 在 QtRO) 进行处理。各 Replica (复本) 接收 Source (源) 特性改变或发射信号的更新。

A 复本 是轻量级代理对于 对象,但 Replica (复本) 支持如 QObjects 的相同连接和行为,使之能以相同方式使用如任何其它 QObject 由 Qt 提供。在幕后,QtRO 处理看起来像其 Source (源) 的 Replica (复本) 的一切必要。

注意,远程对象的行为异于传统 RPC (远程过程调用) 实现,例如:

  • 在 RPC,客户端发出请求并等待响应。
  • 在 RPC,服务器不会向客户端推送任何东西,除非是响应请求。
  • 通常,RPC 的设计是不同客户端彼此独立:例如,2 客户端可以询问映射服务方向,并获得不同结果。

虽然以 QtRO 实现这种 RPC 风格行为是可能的,如没有特性的 Source (源) 和拥有返回值的槽,但 QtRO 隐藏了处理是真正远程的事实。让节点给您 Replica (复本),而不是自己创建的,可以使用状态信号 ( isReplicaValid ()),然后与对象交互就像采用任何其它 QObject 基类型。

使用案例:GPS

考虑传感器,譬如 GPS (全球定位系统) 接收器。按 QtRO 术语:

  • The 将是与 GPS 硬件直接交互并派生你当前位置的进程。
  • 位置将暴露成 QObject 特性;对位置的周期性更新将更新这些特性并发射特性改变信号。
  • Replicas 将在其它进程中被创建且始终知道您的当前位置,但不需要任何逻辑计算来自传感器数据的位置。
  • 连接到 Replica (复本) 的位置改变信号将如期望般工作:从 Source (源) 发射的信号将触发每个复本发出的信号。

使用案例:访问打印机

考虑对打印机提供访问的服务。按 QtRO 术语:

  • The 将是直接控制打印机的进程。
  • 墨水量和打印机状态的监视是通过 QObject 特性。这些特性的更新将发射特性改变信号。
  • 关键特征 - 要打印一些东西 - 需要传回打印机。顺便说一下,这与 Qt 槽机制一致,QtRO 的使用方式对于 Replicas 是对 Source (源) 进行调用。实际上,特性和信号是从 Source (源) 到 Replica (复本);槽是从 Replica (复本) 到 Source (源)。
  • 当打印请求被接受时,打印机状态改变,触发状态特性改变。然后,这会被报告给所有 Replica (复本)。

使用模块

使用 Qt 模块要求直接或透过其它依赖链接到模块库。一些构建工具为此有贡献支持,包括 CMake and qmake .

构建采用 CMake

使用 find_package() 命令去定位所需模块组件,在 Qt6 包:

find_package(Qt6 REQUIRED COMPONENTS RemoteObjects)
					

另请参阅 构建采用 CMake 概述。

采用 qmake 构建

要配置采用 qmake 构建模块,添加模块作为值为 QT 变量在工程的 .pro 文件:

QT       += remoteobjects
					

文章和指南

API 参考

许可

Qt Remote Objects 在商业许可下是可用的来自 Qt 公司 。此外,它是可用的根据 GNU LGPL (次一般公共许可) 第 3 版 ,或 GNU GPL (一般公共许可) 第 2 版 。见 Qt 许可 进一步了解细节。