Qt 远程对象源

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

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

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

欲了解更多信息,请参阅Remote Object Interaction

让repc为您的项目生成一个源头文件,使用REPC_SOURCE变量,提供了三种不同的选项来实现所需的API。

假设你的类名是 Foo,那么你有以下选项:

有关如何创建.rep文件的更多详细信息,请参阅The rep file format

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

如果你需要隐藏你的实现细节,请使用头文件中声明的第二个类,即Source类。这个类的定义不提供数据成员,并且使getter/setter函数成为纯虚函数。虽然你可能需要编写更多的代码,但使用这个类可以在实现中提供更多的灵活性。

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

注意

副本和源都继承自QObject;但它们的QObject API从不暴露。例如,虽然副本有一个destroyed信号,但源的destroyed信号不会传播。源及其每个副本都是具有自己连接和生命周期的唯一QObject。相反,暴露的API由repc使用的.rep模板定义。在原始QObject的情况下,所有API元素都从特定祖先的继承链中定义。除非你在祖先中定义了Q_CLASSINFO("RemoteObject Type"),否则总是使用QObject的父类。如果你使用Q_CLASSINFO("RemoteObject Type"),则该类的API是使用的最低级别API。

识别来源

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

  • 可以选择将名称传递给enableRemoting()。如果提供了名称,则使用该名称。

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

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

  • 如果以上都不可用,调用 enableRemoting() 将失败,返回 false。