本页内容

Qt Remote Objects 副本

编译后的副本是一种基于QRemoteObjectReplica 的类型,其派生类定义由repc编译器自动生成。当您使用CMake函数 或qmake变量运行repc编译器时,这会使生成过程成为构建流程的一部分。尽管仅生成一个头文件,但这已是一个完整的类型。 该类型没有公共构造函数,因此您需要使用QRemoteObjectNode::acquire 模板函数来创建Replica实例。

QRemoteObjectDynamicReplica 可以在运行时生成。要实现这一点,需调用QRemoteObjectNode::acquireDynamic(),并将源名称(即QString )作为参数传入。从 C++ 调用动态 Replica 时,代码会稍显冗长,但无需编译。在初始化完成之前,动态 Replica 不支持属性初始值,也不支持内省。

这两种创建副本的方式之间有一个重要区别,即副本初始化前的行为。由于动态副本只有在初始化后才会获得元对象,因此在初始化前它基本上没有 API——既没有属性,也没有可用于连接槽的信号。

由于编译型复制的 metaObject 在编译时便已创建,因此在实例化复制时其 API 即可使用。您甚至可以在模板文件中为属性提供默认值,这些默认值将在复制通过源代码中的当前值进行初始化之前一直有效。

副本初始化

主机节点会将其托管的源列表与所有连接到它的其他节点共享。当源被添加到列表中或从列表中移除时,该主机将发送更新。 通过这种方式,已连接的节点将始终知道自己可以连接到哪些源。针对特定源的更改只会传播给拥有该源副本的节点。因此,这可以避免任何不必要的网络流量。

当节点获取某个已知源的副本时,它会向主机节点发送针对该源的请求。收到此请求后,主机将生成一个包含该源所有属性当前值的响应数据包。如果请求的副本类型为dynamic ,则响应数据包中将包含该源的 API 定义。 从那时起,该副本所在的节点将被纳入接收该源变更的连接列表中。

如果实例化了一个副本,但其节点未连接到托管所请求源的节点——或者该对象位于主机节点进程中,但QObject 尚未启用共享/远程访问——则副本仍会被创建,但保持未初始化状态。

如果稍后,该副本的节点收到通知,得知所请求的源可从一个已连接的节点获得,那么此时它将请求该源并开始初始化过程。

如果与主机节点的连接中断,副本将转为无效状态。它将尝试重新连接,并在连接恢复后重新初始化;这可确保所有属性均保持最新状态。

副本所有权

获取方法返回指向由节点实例化的复制对象QObject 的指针。节点无法得知该复制对象的预期生命周期。因此,当不再需要该复制对象时,调用程序有责任将其删除。

您可以实例化同一副本的多个副本。来自单个节点的同一源的所有副本将共享一个处理网络通信的私有数据成员。这意味着副本的多个实例不会引入额外的网络流量,尽管会产生一些额外的处理开销。 如果未删除副本,将导致该私有对象的引用计数无法归零,并造成不必要的网络通信,直至调用进程退出。因此,建议使用QScopedPointer 或QSharedPointer 来帮助跟踪副本的生命周期。

© 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.