Qt远程对象源#

描述了源的概念以及如何使用repc生成的源头文件。.. _source: QRemoteObjectSource(“源”)是QObject,负责实现公开的API。

从高层次来看,你可以选择直接使用QObject类型作为源;或者你可以在.rep模板中定义所需的API以与repc编译器一起使用。

如果你已经有一个完全定义的QObject,你可以通过将其传递给enableRemoting() 使用它作为源。这样,其他进程或设备就可以创建对象的动力复制(dynamics replicas)来与之交互。

有关更多信息,请参阅远程对象交互

使用REPC_SOURCE变量,允许repc为你的项目生成源头文件,提供三种不同的选项来实现所需的API。

假设你的类名为Foo,那么你有以下几种选择

有关如何创建.rep文件的更详细说明,请参阅rep文件格式

在头文件中定义了一个名为<Type>SimpleSource的类,它为每个属性提供了基本的getter/setter方法,并在头文件中实现了正确属性类型的数据成员。“<Type>”代表.rep文件中的类名,因此如果您的类在.rep文件中的类型为“MyType”,则生成的头文件将声明MyTypeSimpleSource类。这是一个快速开始使用API的方法。要使用此类,你需要编写一个继承自它的类,并实现生成的头文件中标记为纯虚的任何槽位。你还需要在你的类中添加必要的逻辑来管理公开的属性和发出信号。

如果您需要隐藏实现细节,请使用头文件中声明的第二个类,即《Source》类。这个类的定义没有提供数据成员,并将获取器/设置器函数定义为纯虚函数。虽然您可能需要编写更多代码,但使用这个类可以使您在实现方面更加灵活。

头文件中生成的第三个类是《SourceAPI》。这是一个模板类,专门用于模板版本的 enableRemoting() 方法,允许您使用支持所需 API 的任何 QObject 作为源。使用这个类来隐藏或转换属性或信号/槽参数。如果您的实现没有提供正确的 API,将会有编译时警告。

注意

副本和源都继承自 QObject;但它们的 QObject API 永远不会公开。例如,虽然副本有一个销毁信号,但源的销毁信号不会传递。源及其每个副本都是独特的 QObject,它们有自己的事件连接和生命周期。相反,公开的 API 由 repc 所使用的 .rep 模板定义。对于原始 QObject,所有 API 元素都定义在从一个特定祖先继承的继承链中。如果祖先中定义了 Q_CLASSINFO("RemoteObject Type"),则使用 QObject 的父对象,除非在祖先中定义了 Q_CLASSINFO("RemoteObject Type")。如果您使用 Q_CLASSINFO("RemoteObject Type"),那么该类的 API 就是使用的最低级别的 API。

识别源#

因为主节点可以共享多个源,所以每个源都需要一个名字。所有由 repc 生成的头文件都包括一种方式,让节点确定类名:用于副本、 simplesource 或源类型的 Q_CLASSINFO;或用于 SourceAPI 类型的静态 name() 函数。如果您将您的 QObject 类型传递给 enableRemoting() ,则使用以下逻辑确定名字

  • 可以可选地向 enableRemoting() 传递名字。如果提供,则使用该名字。

  • 如果对象或其任何祖先有定义类型为“RemoteObject Type”的 Q_CLASSINFO,则使用该类型名。

  • 如果设置了 QObject 的 objectName,则使用它。

  • 如果没有以上任何一个可用,则调用 enableRemoting() 失败,返回 false。