Qt Remote Objects 源

高水平,可以选择使用 QObject 类型直接作为 Source (源);或者可以定义期望 API 在 .rep 模板为用于 repc 编译器。

若已经拥有完全定义 QObject ,可以把它用作 Source (源) 通过将其传递给 QRemoteObjectHostBase::enableRemoting ()。这样,其它进程 (或设备) 则可以创建 动态复本 对于要交互对象。

更多信息,见 远程对象交互 .

让 RepC (复本编译器) 为工程生成 Source (源) 头文件,使用 REPC_SOURCE 变量,为实现要求 API 有提供 3 种不同选项。

假设类名为 Foo,那么拥有下列选项:

更多细节关于如何创建 .rep 文件,见 *.REP 文件格式 .

在头中定义的 <Type>SimpleSource 类,有为各特性提供基本 getter/setter 方法,并在头中实现了正确特性类型的数据成员。这里的 <Type> 表示类名来自 .rep 文件,因此,若类是 MyType 类型在 .rep 文件,那么,生成的头文件将拥有 MyTypeSimpleSource 类声明。这是使用 API 的快速入门方式。要使用此类,需要编写继承自它的类,并实现在生成的头文件中被标记为纯虚拟的任何槽定义。还需要向类添加必要逻辑,以管理暴露特性和发射信号。

若需要隐藏实现细节,使用在头文件中声明的第 2 <Type>Source 类。此类定义不提供数据成员,并将 getter/setter 函数制作成纯虚拟。虽然可能需要编写更多代码,但是在实现中使用此类可赋予更多灵活性。

The third class generated in the header is <Type>SourceAPI. This is a templated class, for use specifically by the templated version of QRemoteObjectHostBase::enableRemoting (), which allows you to use any QObject that supports the required API as the source. Use this class to hide or convert properties or signal/slot parameters. If your implementation does not provide the correct API, there will be compile-time warnings.

注意: Replicas and sources both derive from QObject ; but their QObject API 是 never exposed. For instance, while a replica has a destroyed 信号,源的 destroyed signal is not propagated. The source and each of its replica are unique QObjects with their own connections and lifetimes. Instead, the API that is exposed is defined by the .rep template used by repc. In the case of raw QObjects, all API elements are defined in the inheritance chain from a specific ancestor. The QObject 's parent is always used, unless you define Q_CLASSINFO("RemoteObject Type") in an ancestor. If you use Q_CLASSINFO("RemoteObject Type") , that class's API is the lowest level of API used.

标识源

由于主机 Node (节点) 可以共享多个 Source (源),所以每个源都要求名称。所有 RepC (复本编译器) 生成头,都包括节点确定类名的方式: Q_CLASSINFO 用于 Replica (复本)、SimpleSource (简单源)、或 Source (源) 类型;或静态 name() 函数用于 SourceAPI 类型。若传递自己的 QObject 类型到 QRemoteObjectHostBase::enableRemoting (),使用下列逻辑确定名称: