Qt 远程对象源
在高层面上,您可以选择直接使用QObject类型作为源;或者您可以在用于repc编译器的.rep模板中定义所需的API。
如果您已经有一个完全定义的QObject,您可以将其传递给QRemoteObjectHostBase::enableRemoting()作为源使用。这样,其他进程或设备就可以创建对象的动态副本以进行交互。
有关更多信息,请参阅远程对象交互。
使用REPC_SOURCE变量使repc为您的项目生成源头文件,提供三种不同的选项来实现所需的API。
假设您的类名为Foo,您有以下选项:
- FooSimpleSource 继承
- FooSource 继承
- FooSourceAPI 与自己的QObject一起使用
有关如何创建.rep文件的更多详细信息,请参阅rep文件格式。
头文件中定义了<Type>SimpleSource类,为每个属性提供基本的getter/setter方法,并在头文件中实现了正确类型的属性数据成员。在这里,“<Type>”代表来自.rep文件的类名,因此如果您的类在.rep文件中是类型"MyType",则生成的头文件将声明MyTypeSimpleSource类。这是开始使用该API的快捷方式。要使用此类,您需要编写一个继承自它的类,并实现任何在生成头文件中标记为纯虚的槽。您还需要将必要的逻辑添加到您的类中,以管理公开的属性和发射信号。
如果您需要隐藏实现细节,请使用头文件中声明的第二个类,即<Type>Source类。此类的定义不提供数据成员,并使getter/setter函数纯虚。虽然您可能需要编写更多的代码,但使用此类使您的实现更加灵活。
头文件中生成的第三个类是<Type>SourceAPI。这是一个模板类,专门用于使用模板版本的QRemoteObjectHostBase::enableRemoting()。它允许您将任何支持所需API的QObject用作源。使用此类隐藏或转换属性或信号/slot参数。如果您的实现没有提供正确的API,则会在编译时发出警告。
注意: 副本和源都来自 QObject;但它们的 QObject API 从不公开。例如,虽然副本有 destroyed 信号,但源的 destroyed 信号不会传播。源及其每个副本都是独特的 QObjects,具有自己的连接和生命周期。相反,公开的 API 由 repc 使用 .rep
模板定义。对于原始 QObjects,所有 API 元素都在从特定祖先的继承链中定义。除非在祖先中定义了 Q_CLASSINFO("RemoteObject Type")
,否则总是使用 QObject 的父对象。如果您使用 Q_CLASSINFO("RemoteObject Type")
,则该类的 API 是使用的 API 最低级别。
识别源
因为主节点可以共享多个源,所以每个源都需要一个名称。所有由 repc 生成的头文件都包含一种方法,用于节点确定类名:用于副本、简单源或源类型的 Q_CLASSINFO;或者对于 SourceAPI 类型,使用静态 name()
函数。如果您将您自己的 QObject 类型传递给 QRemoteObjectHostBase::enableRemoting(),则使用以下逻辑确定名称
- 可以可选地将名称传递给 QRemoteObjectHostBase::enableRemoting()。如果提供,则使用该名称。
- 如果对象或其祖先中定义了类型为 "RemoteObject Type" 的 Q_CLASSINFO,则使用该类型名称。
- 如果设置了 QObject 的 objectName,则使用它。
- 如果上述任何一个都不可用,则调用 QRemoteObjectHostBase::enableRemoting() 失败,返回 false。
© 2024 Qt 公司有限公司。包含在此处的文档贡献是各自所有者的版权。此处提供的文档根据自由软件基金会发布的 GNU 自由文档许可版本 1.3 的条款进行许可。Qt 和相应标志是芬兰和/或世界其他地区的 Qt 公司的商标。所有其他商标均为各自所有者的财产。