QRemoteObjectHostBase 类
QRemoteObjectHostBase 类提供了 Host 和 RegistryHost 类通用的基本功能。有关更多详细信息,请参阅 更多...
头文件 | #include <QRemoteObjectHostBase> |
CMake | find_package(Qt6 REQUIRED COMPONENTS RemoteObjects) target_link_libraries(mytarget PRIVATE Qt6::RemoteObjects) |
qmake | QT += remoteobjects |
继承 | QRemoteObjectNode |
继承自 |
公共类型
枚举 | AllowedSchemas { BuiltInSchemasOnly, AllowExternalRegistration } |
公共函数
void | addHostSideConnection(QIODevice *ioDevice) |
bool | disableRemoting(QObject *remoteObject) |
bool | enableRemoting(ObjectType *object) |
bool | enableRemoting(QObject *object, const QString &name = QString()) |
bool | enableRemoting(QAbstractItemModel *model, const QString &name, const QList<int> roles, QItemSelectionModel *selectionModel = nullptr) |
bool | proxy(const QUrl ®istryUrl, const QUrl &hostUrl = {}, QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](QStringView, QStringView) {return true; }) |
bool | reverseProxy(QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](QStringView, QStringView) {return true; }) |
重写的公共函数
virtual void | setName(const QString &name) override |
详细说明
QRemoteObjectHostBase 是一个无法直接实例化的基础类。它提供了所有宿主节点(Host 和 RegistryHost)共有的 enableRemoting 和 disableRemoting 功能,以及暴露远程对象网络上 源 对象所需的各种逻辑。
成员类型说明
enum QRemoteObjectHostBase::AllowedSchemas
此枚举用于指定一个节点是否接受 hostUrl 中不识别模式的 URL。默认情况下,仅接受已知模式的 URL,但如果使用 AllowExternalRegistration
,则将使 注册表 能够将您的外部(对 QtRO)URL 传递给客户端节点。
常量 | 值 | 描述 |
---|---|---|
QRemoteObjectHostBase::BuiltInSchemasOnly | 0 | 仅允许将 hostUrl 设置为由 QtRO 支持的方案。这是默认值,如果提供了不可识别的方案,则会设置 Node 错误。 |
QRemoteObjectHostBase::AllowExternalRegistration | 1 | 提供的方案注册为 外部方案 |
另请参阅 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。如果你想同步 Source 和 Replica 之间的选择,可以使用可选的 selectionModel 参数。这仅在单个副本的使用下推荐。
在幕后,Qt 远程对象批量数据()搜索并在可能的情况下预取数据,以使模型交互尽可能地响应。
如果当前节点是客户端节点,或者如果 QObject 已经注册为要远程访问的,则返回 false
;如果成功为 QAbstractItemModel 启用远程访问,则返回 true
。
另请参阅 disableRemoting.
bool QRemoteObjectHostBase::proxy(const QUrl ®istryUrl, 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.的商标。所有其他商标归其各自所有者所有。