本页内容

Qt Remote Objects

远程对象概念

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

为了实现这种信息交换,Qt的一项关键特性在于区分了对象的API(由其属性、信号和槽定义)与该API的实现。QtRO的目的是满足预期的API,即使真正的QObject 位于另一个进程中。 在对象副本(QtRO 中的“Replica”)上调用的槽会被转发至真实对象(QtRO中的“Source”)进行处理。每个 Replica 都会接收来自 Source 的更新,无论是属性变化还是发出的信号。

Replica是Source对象的一个轻量级代理,但它支持与 QObject 相同的连接和行为,因此可以像 Qt 提供的任何其他QObject 一样使用。在后台,QtRO 会处理一切必要的工作,以确保 Replica 表现得与其 Source 完全一致。

请注意,远程对象的行为与传统的远程过程调用(RPC)实现不同,例如:

  • 在 RPC 中,客户端发出请求并等待响应。
  • 在 RPC 中,除非是响应请求,否则服务器不会向客户端推送任何内容。
  • 通常,RPC 的设计使得不同的客户端彼此独立:例如,两个客户端向地图服务查询路线时,可能会得到不同的结果。

虽然可以在 QtRO 中通过“无属性的源”和“具有返回值的槽”来实现这种 RPC 风格的行为,但 QtRO 掩盖了处理实际上是在远程进行这一事实。 您可以让节点为您提供 Replica,而不是自己创建它,可能使用状态信号(isReplicaValid()),然后像对待任何其他基于QObject 的类型一样与该对象交互。

用例:GPS

考虑一个传感器,例如全球定位系统(GPS)接收器。用 QtRO 的术语来说:

  • “源”(Source)是指直接与GPS硬件交互并推导出当前位置的进程。
  • 位置信息将作为QObject 属性对外暴露;位置的周期性更新会更新这些属性,并发出属性变更信号。
  • 副本将在其他进程中创建,它们始终知道您的当前位置,但无需任何逻辑来根据传感器数据计算位置。
  • 在副本上订阅位置变更信号将按预期工作:源发出的信号会触发每个副本的信号发射。

用例:打印机访问

假设有一个提供打印机访问服务的服务。用 QtRO 的术语来说:

  • 源(Source)即为直接控制打印机的进程。
  • 墨水余量和打印机状态将由QObject 属性进行监控。这些属性的更新会触发属性变更信号。
  • 关键功能——即能够打印内容——需要传递回打印机。顺便提一下,这与 Qt 的槽机制相吻合,QtRO 正是利用该机制让副本向源进程发起调用。实际上,属性与信号从源流向副本;而槽则从副本流向源。
  • 当打印请求被接受时,打印机状态会发生变化,从而触发状态属性的变更。随后,该变更将报告给所有副本。

使用该模块

使用 Qt 模块需要链接到该模块库,可以是直接链接,也可以是通过其他依赖项间接链接。包括CMake和qmake 在内的多种构建工具都对此提供了专门的支持。

使用 CMake 进行构建

使用find_package() 命令在Qt6 软件包中定位所需的模块组件:

find_package(Qt6 REQUIRED COMPONENTS RemoteObjects)

另请参阅“使用 CMake 构建”概述。

使用 qmake 进行构建

要配置模块以便使用 qmake 进行构建,请在项目的 .pro 文件中将该模块作为QT 变量的值添加:

QT       += remoteobjects

文章与指南

API 参考

许可

Qt Remote Objects 本软件可依据The Qt Company 提供的商业许可使用。此外,本软件也可依据GNU 较少通用公共许可证第 3 版或GNU 通用公共许可证第 2 版使用。更多详情请参阅Qt 许可条款。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.