QRemoteObjectHostBase 类

QRemoteObjectHostBase 类提供了 Host 和 RegistryHost 类通用的基本功能。有关更多详细信息,请参阅 更多...

头文件 #include <QRemoteObjectHostBase>
CMakefind_package(Qt6 REQUIRED COMPONENTS RemoteObjects)
target_link_libraries(mytarget PRIVATE Qt6::RemoteObjects)
qmakeQT += remoteobjects
继承 QRemoteObjectNode
继承自

QRemoteObjectHostQRemoteObjectRegistryHost

公共类型

枚举AllowedSchemas { BuiltInSchemasOnly, AllowExternalRegistration }

公共函数

voidaddHostSideConnection(QIODevice *ioDevice)
booldisableRemoting(QObject *remoteObject)
boolenableRemoting(ObjectType *object)
boolenableRemoting(QObject *object, const QString &name = QString())
boolenableRemoting(QAbstractItemModel *model, const QString &name, const QList<int> roles, QItemSelectionModel *selectionModel = nullptr)
boolproxy(const QUrl &registryUrl, const QUrl &hostUrl = {}, QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](QStringView, QStringView) {return true; })
boolreverseProxy(QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](QStringView, QStringView) {return true; })

重写的公共函数

virtual voidsetName(const QString &name) override

详细说明

QRemoteObjectHostBase 是一个无法直接实例化的基础类。它提供了所有宿主节点(HostRegistryHost)共有的 enableRemotingdisableRemoting 功能,以及暴露远程对象网络上 对象所需的各种逻辑。

成员类型说明

enum QRemoteObjectHostBase::AllowedSchemas

此枚举用于指定一个节点是否接受 hostUrl 中不识别模式的 URL。默认情况下,仅接受已知模式的 URL,但如果使用 AllowExternalRegistration,则将使 注册表 能够将您的外部(对 QtRO)URL 传递给客户端节点。

常量描述
QRemoteObjectHostBase::BuiltInSchemasOnly0仅允许将 hostUrl 设置为由 QtRO 支持的方案。这是默认值,如果提供了不可识别的方案,则会设置 Node 错误。
QRemoteObjectHostBase::AllowExternalRegistration1提供的方案注册为 外部方案

另请参阅 QRemoteObjectHost.

成员函数文档

void QRemoteObjectHostBase::addHostSideConnection(QIODevice *ioDevice)

为了在 QRemoteObjectHost::enableRemoting() 中源对象通过 外部 QIODevices,Qt Remote Objects 需要访问各个节点之间的通信通道(QIODevice)。addHostSideConnection() 调用实现在 端启用此操作,并以 ioDevice 作为输入。任何enableRemoting() 调用仍将在不调用 addHostSideConnection 的情况下正常工作,但节点在未提供到副本节点的连接的情况下无法共享 对象。在调用此函数之前,您必须使用唯一的 URL 和 AllowExternalRegistration 调用 setHostUrl()。

另请参阅 addClientSideConnection.

[可调用] bool QRemoteObjectHostBase::disableRemoting(QObject *remoteObject)

禁用 QObject remoteObject 的远程访问。如果当前节点是客户端节点或 remoteObject 未注册,则返回 false,如果在源对象上成功禁用远程访问,则返回 true

警告:调用此方法后,该对象的副本将不再有效。

注意:此函数可以通过元对象系统从 QML 调用。请参阅 Q_INVOKABLE

另请参阅 enableRemoting

模板 <template <typename> typename ApiDefinition, typename ObjectType> bool QRemoteObjectHostBase::enableRemoting(ObjectType *object)

此模板函数重载允许可用主机节点为具有指定(且在编译时检查)接口的 QObject 对象 提供远程访问。连接到此对象的客户端节点可以获得此源对象的副本。

以下是一个示例,说明最合适的用例

#include "rep_TimeModel_source.h"
MinuteTimer timer;
hostNode.enableRemoting<MinuteTimerSourceAPI>(&timer);

在这里,MinuteTimerSourceAPI 是由 TimeModel.rep 文件定义的一系列信号/槽/属性。编译时检查确保输入的 QObject 能够暴露所需的 API,否则将无法编译。这允许暴露 object 的接口子集,并且允许支持信号/槽连接的类型转换。

如果当前节点是客户端节点或 QObject 已注册为远程对象,则返回 false,如果成功启用了 QObject 的远程访问,则返回 true

另请参阅 disableRemoting.

[可调用] bool QRemoteObjectHostBase::enableRemoting(QObject *object, const QString &name = QString())

允许主机节点动态提供对 QObject 对象 的远程访问。连接到托管此对象的客户端节点可以获取该源的副本。

可选的 name 定义了 QObject 可通过 QRemoteObjectNode::acquire() 获取的查找名称。如果没有明确设置,则使用 QCLASSINFO_REMOTEOBJECT_TYPE 中给出的名称。如果没有为 QObject 定义此类宏,则使用 QObject::objectName()。

如果当前节点是客户端节点,或者如果 QObject 已经注册为要远程访问的,则返回 false;如果成功为动态 QObject 启用远程访问,则返回 true

注意:此函数可以通过元对象系统从 QML 调用。请参阅 Q_INVOKABLE

另请参阅 disableRemoting.

bool QRemoteObjectHostBase::enableRemoting(QAbstractItemModel *model, const QString &name, const QList<int> roles, QItemSelectionModel *selectionModel = nullptr)

QAbstractItemModel 类型(或任何从 QAbstractItemModel 派生的类型)的重载 enableRemoting() 很有用。如果你想在不同的进程中拥有模型和模型的人机界面 (HMI)。

所需的三个参数是模型本身、作为查找模型的 name,以及应该在外部副本端公开的 roles。如果你想同步 SourceReplica 之间的选择,可以使用可选的 selectionModel 参数。这仅在单个副本的使用下推荐。

在幕后,Qt 远程对象批量数据()搜索并在可能的情况下预取数据,以使模型交互尽可能地响应。

如果当前节点是客户端节点,或者如果 QObject 已经注册为要远程访问的,则返回 false;如果成功为 QAbstractItemModel 启用远程访问,则返回 true

另请参阅 disableRemoting.

bool QRemoteObjectHostBase::proxy(const QUrl &registryUrl, const QUrl &hostUrl = {}, QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](QStringView, QStringView) {return true; })

转发来自另一个网络的远程对象

当您想在多个网络上共享 Source 对象时,代理功能很有用。例如,如果您有一个嵌入式目标,它使用仅用于目标的连接(如本地),并且您想要使某些相同对象对外部可用。

作为一个具体的例子,假设您有一组在你的目标硬件上使用注册表互相通信的过程,注册表在 "local:registry" 上,而其他过程使用在 "local:MyHost" 上的节点,该节点持有 Source 对象。如果您想访问这些对象但又想通过 tcp,您可以创建一个新的代理节点,如下所示

// myInternalHost is a node only visible on the device...
QRemoteObjectHost myInternalHost("local:MyHost");
myInternalHost.enableRemoting<SomeObject>(&someObject);

// Regular host node, listening on port 12123, so visible to other
// devices
QRemoteObjectHost proxyNode("tcp://localhost:12123");

// Enable proxying objects from nodes on the local machine's internal
// QtRO bus
proxyNode.proxy("local:registry");

从另一个设备创建另一个节点。

// NB: localhost resolves to a different ip address than proxyNode
QRemoteObjectHost nodeOnRemoteDevice("tcp://localhost:23234");

// Connect to the target's proxyNode directly, or use a tcp registry...
nodeOnRemoteDevice.connectToNode("tcp://<target device>:12123");

// Because of the proxy, we can get the object over tcp/ip port 12123,
// even though we can't connect directly to "local:MyHost"
SomeObject *so = nodeOnRemoteDevice.acquire<SomeObject>();

这将(在内部)在proxyNode中创建一个节点,该节点(再次内部/自动)连接到提供的注册表(由registryUrl参数指定,在此例中为"local:registry")。每当local:registry发出remoteObjectAdded信号时,将QRemoteObjectSourceLocation传递给代理调用时提供的filter。如果此方法返回true(默认filter简单返回true,不进行任何过滤),则从内部节点enableRemoting()获取对象(一旦副本初始化)在proxyNode上被调用。

如果提供了hostUrl(这是启用reverseProxy所必需的,但其他情况下不是必需的),则内部节点将是一个配置了提供地址的QRemoteObjectHost节点。如果没有提供hostUrl,则内部节点将是一个QRemoteObjectNode(不是HostNode)。

如果从内部节点获取对象,则返回true

另请参阅reverseProxy

bool QRemoteObjectHostBase::reverseProxy(QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](QStringView, QStringView) {return true; })

将远程对象转发到另一个网络。

reverseProxy()函数允许扩展proxy()功能,实际上在"反向"方向上镜像代理功能。这些是不同的,因为节点通信不是对称的,一方面使用enableRemoting()与Source对象调用,另一方面调用acquire()以获取Replica。使用proxy()允许您通过acquire远程地"观察"目标设备上的对象,但它不允许从设备的本地:*网络上获取目标Source对象。这就是reverseProxy()的用武之地。如果创建了如下所示的proxyNode

// myInternalHost is a node only visible on the device...
QRemoteObjectHost myInternalHost("local:MyHost", "local:registry");

// RegistryHost node, listening on port 12123, so visible to other
// devices.  The node must be a RegistryHost, so the Sources on
// the "outside" network can be forwarded to the inner network.
QRemoteObjectRegistryHost proxyNode("tcp://0.0.0.0:12123");

// Enable proxying objects from nodes on the local machine's internal
// QtRO bus.  Note the hostUrl parameter is now needed.
proxyNode.proxy("local:registry", "local:fromProxy");
proxyNode.reverseProxy();

从另一个设备创建另一个节点。

// Listen on a local port, and connect to "proxyNode" as the registry.
// NB: localhost resolves to a different ip address than proxyNode
QRemoteObjectHost nodeOnRemoteDevice("tcp://localhost:23234",
                                     "tcp://<target device>:12123");

// Because of the reverseProxy, we can expose objects on this device
// and they will make their way to proxyNode...
nodeOnRemoteDevice.enableRemoting<OtherObject>(&otherObject);
// Acquire() can now see the objects on other devices through proxyNode,
// due to the reverseProxy call.
OtherObject *oo = myInternalHost.acquire<OtherObject>();

proxy()功能允许在另一个网络上获取Source对象时,reverseProxy()允许将Source对象"推"到一个否则无法访问的网络。

注意:proxy()必须在reverseProxy()之前调用,并且必须提供一个hostUrl给proxy以使reverseProxy()生效。reverseProxy()方法允许应用一个单独的filter。此reverseProxy特定的filter将接收有关proxyNode上新的Source对象的通知,并在通过filter的情况下在内部节点上获取它们。

成功时返回true,否则返回false

注意:当前reverse proxy功能仅支持QRemoteObjectRegistryHost。在一个QRemoteObjectHost节点上调用此方法将始终返回false

另请参阅proxy

[重写虚函数] void QRemoteObjectHostBase::setName(const QString &name)

重新实现了:QRemoteObjectNode::setName(const QString &name)。

类似于 QObject::setObjectName()(此方法会调用此函数),但这个版本还将 名称 应用于内部类,这些内部类用于某些调试输出。

© 2024 The Qt Company Ltd. 本文件中包含的文档贡献者的文档版权所有。本文件提供的内容受 GNU自由文档许可1.3版本 的条款约束,由自由软件基金会发布。Qt及其相关标志是芬兰及全球其他国家的The Qt Company Ltd.的商标。所有其他商标归其各自所有者所有。