本页内容

QRemoteObjectNode Class

Qt Remote Objects 网络上的一个节点。更多内容...

标题: #include <QRemoteObjectNode>
CMake: find_package(Qt6 REQUIRED COMPONENTS RemoteObjects)
target_link_libraries(mytarget PRIVATE Qt6::RemoteObjects)
qmake: QT += remoteobjects
在 QML 中: Node
继承自: QObject
被继承自:

QRemoteObjectHostBase

公共类型

enum ErrorCode { NoError, RegistryNotAcquired, RegistryAlreadyHosted, NodeIsNoServer, ServerAlreadyCreated, …, SocketAccessError }
RemoteObjectSchemaHandler

属性

公共函数

QRemoteObjectNode(QObject *parent = nullptr)
QRemoteObjectNode(const QUrl &registryAddress, QObject *parent = nullptr)
ObjectType *acquire(const QString &name = QString())
QRemoteObjectDynamicReplica *acquireDynamic(const QString &name)
QAbstractItemModelReplica *acquireModel(const QString &name, QtRemoteObjects::InitialAction action = QtRemoteObjects::FetchRootSize, const QList<int> &rolesHint = {})
void addClientSideConnection(QIODevice *ioDevice)
bool connectToNode(const QUrl &address)
int heartbeatInterval() const
QStringList instances() const
QStringList instances(QStringView typeName) const
QRemoteObjectNode::ErrorCode lastError() const
QRemoteObjectAbstractPersistedStore *persistedStore() const
void registerExternalSchema(const QString &schema, QRemoteObjectNode::RemoteObjectSchemaHandler handler)
const QRemoteObjectRegistry *registry() const
QUrl registryUrl() const
void setHeartbeatInterval(int interval)
virtual void setName(const QString &name)
void setPersistedStore(QRemoteObjectAbstractPersistedStore *persistedStore)
virtual bool setRegistryUrl(const QUrl &registryAddress)
bool waitForRegistry(int timeout = 30000)

信号

void heartbeatIntervalChanged(int heartbeatInterval)
(since 6.12) void persistedStoreChanged(QRemoteObjectAbstractPersistedStore *persistedStore)
(since 6.12) void registryUrlChanged(const QUrl &registryUrl)
void remoteObjectAdded(const QRemoteObjectSourceLocation &loc)
void remoteObjectRemoved(const QRemoteObjectSourceLocation &loc)

重新实现的受保护函数

virtual void timerEvent(QTimerEvent *) override

详细说明

QRemoteObjectNode 类为QtRemoteObjects 网络提供了一个入口点。一个网络可以简单到仅包含两个节点,也可以是任意复杂的进程和设备集合。

QRemoteObjectNode 没有其他节点可以连接的 URL,因此只能获取副本。它无法共享源对象(只有QRemoteObjectHost 和QRemoteObjectRegistryHost 节点可以共享)。

节点可以使用connectToNode 直接相互连接,也可以使用QRemoteObjectRegistry 来简化连接。

QRemoteObjectRegistry 是每个连接到 Registry Url 的节点均可访问的特殊副本。它知道如何连接到网络上的每个 QRemoteObjectSource 对象。

另请参阅 QRemoteObjectHost 和QRemoteObjectRegistryHost 。

成员类型文档

enum QRemoteObjectNode::ErrorCode

此枚举类型指定了与QRemoteObjectNode 错误相关的各种错误代码:

常量常量描述
QRemoteObjectNode::NoError0无错误。
QRemoteObjectNode::RegistryNotAcquired1无法获取注册表。
QRemoteObjectNode::RegistryAlreadyHosted2该注册表已定义且正在托管源。
QRemoteObjectNode::NodeIsNoServer3给定的QRemoteObjectNode 不是主机节点。
QRemoteObjectNode::ServerAlreadyCreated4主机节点已初始化。
QRemoteObjectNode::UnintendedRegistryHosting5尝试创建主机QRemoteObjectNode 并将其作为注册表连接到自身。
QRemoteObjectNode::OperationNotValidOnClientNode6在客户端QRemoteObjectNode 上尝试的操作无效。
QRemoteObjectNode::SourceNotRegistered7给定的 QRemoteObjectSource 未在此节点上注册。
QRemoteObjectNode::MissingObjectName8给定的QObject 未设置objectName()。
QRemoteObjectNode::HostUrlInvalid9给定的 URL 具有无效或无法识别的方案。
QRemoteObjectNode::ProtocolMismatch10客户端和服务器使用的协议版本不同。
QRemoteObjectNode::ListenFailed11无法在指定的主机端口上监听。
QRemoteObjectNode::SocketAccessError12客户端无权连接到服务器。请确保已正确设置QRemoteObjectHost::setLocalServerOptions 。

QRemoteObjectNode::RemoteObjectSchemaHandler

用于 std::function 方法的类型定义,该方法可接受QUrl 作为输入,并负责在当前节点与托管所需源(Source)的节点之间建立通信通道。 由于某些类型的 QIODevices(例如QSslSocket )在设备准备就绪前需要执行额外步骤,因此该方法负责在连接完全建立后调用addClientSideConnection 。

属性文档

heartbeatInterval : int

心跳间隔(单位:毫秒)。

心跳(仅对套接字连接有用)会定期向已连接的节点发送消息,以检测连接是否中断。Qt Remote Objects 在检测到连接中断时会尝试自动重新连接。此功能有助于进行该检测,因为客户端只有在尝试发送数据时才会检测到服务器不可用。

将该值设为0 (默认值)将禁用心跳功能。

访问函数:

int heartbeatInterval() const
void setHeartbeatInterval(int interval)

通知器信号:

void heartbeatIntervalChanged(int heartbeatInterval)

persistedStore : QRemoteObjectAbstractPersistedStore*

允许为该节点设置一个QRemoteObjectAbstractPersistedStore 实例。

允许具有 PERSISTED 特性的副本PROP成员在副本被删除时保存其当前值,并在下次启动副本时恢复已存储的值。

需要实现QRemoteObjectAbstractPersistedStore 类,以控制持久化的处理位置和方式。

访问函数:

QRemoteObjectAbstractPersistedStore *persistedStore() const
void setPersistedStore(QRemoteObjectAbstractPersistedStore *persistedStore)

通知器信号:

void persistedStoreChanged(QRemoteObjectAbstractPersistedStore *persistedStore)

registryUrl : QUrl

该属性保存了该节点所使用的Registry 的地址。

如果未使用任何注册表,则此处为空的QUrl 。

访问函数:

QUrl registryUrl() const
virtual bool setRegistryUrl(const QUrl &registryAddress)

通知信号:

void registryUrlChanged(const QUrl &registryUrl)

成员函数文档

QRemoteObjectNode::QRemoteObjectNode(QObject *parent = nullptr)

QRemoteObjectNode 的默认构造函数,其parent 参数已给定。以这种方式构造的节点无法被连接,因此无法在网络上暴露源对象。此外,该节点也不会包含QRemoteObjectRegistry ,除非通过setRegistryUrl 手动设置。

另请参阅 connectToNode 和setRegistryUrl 。

QRemoteObjectNode::QRemoteObjectNode(const QUrl &registryAddress, QObject *parent = nullptr)

QRemoteObjectNode 连接到一个 {QRemoteObjectRegistry} {Registry}。以这种方式构建的节点无法被连接,因此无法在网络上暴露源对象。查找和连接其他(主机)节点由registryAddress 中指定的QRemoteObjectRegistry 负责处理。

另请参阅 connectToNode 、setRegistryUrl 、QRemoteObjectHost 以及QRemoteObjectRegistryHost 。

template <typename ObjectType> ObjectType *QRemoteObjectNode::acquire(const QString &name = QString())

返回一个指向类型为 ObjectType 的 Replica 的指针(该类型是模板参数,且必须继承自QRemoteObjectReplica )。也就是说,该模板参数必须是repc生成的类型。name 参数可用于指定在调用QRemoteObjectHost::enableRemoting() 时赋予该对象的name 。

QRemoteObjectDynamicReplica *QRemoteObjectNode::acquireDynamic(const QString &name)

返回源name 的QRemoteObjectDynamicReplica 。

QAbstractItemModelReplica *QRemoteObjectNode::acquireModel(const QString &name, QtRemoteObjects::InitialAction action = QtRemoteObjects::FetchRootSize, const QList<int> &rolesHint = {})

返回一个指向Replica 的指针,该Replica专门从QAbstractItemModel 派生而来。提供的name 必须与将该模型发布到网络的相应enableRemoting 所使用的名称一致。action 指定模型是否应在发出initialized 信号之前预取数据。如果将其设置为QtRemoteObjects::PrefetchData ,则rolesHint 中角色的数据将被预取。 如果 `rolesHint ` 为空,则会预取 `Source` 公开的所有角色的数据。

返回的模型在通过Source 初始化之前将为空。

void QRemoteObjectNode::addClientSideConnection(QIODevice *ioDevice)

为了通过外部 QIODevices 对Replica对象调用QRemoteObjectNode::acquire(),Qt Remote Objects 需要访问各节点之间的通信通道(即QIODevice )。这是通过调用 addClientSideConnection() 实现的,该方法将ioDevice 作为输入参数。 即使未调用 addClientSideConnection,任何acquire() 调用仍可正常工作,但节点在未获得与主节点连接的情况下将无法初始化副本。

另请参阅 QRemoteObjectHostBase::addHostSideConnection 。

[invokable] bool QRemoteObjectNode::connectToNode(const QUrl &address)

将客户端节点连接到位于address 的主机节点。

连接将保持有效,直到主机节点被删除或无法通过网络访问为止。

一旦客户端连接到主机,如果相应的源正在被远程调用,则可以获取有效的副本。

成功时返回true ,否则返回false (通常是未识别的 URL,或连接到已连接的地址)。

注意:此 函数可通过元对象系统和 QML 调用。参见Q_INVOKABLE 。

template <typename T> QStringList QRemoteObjectNode::instances() const

这个模板函数(将repc生成的类型作为模板参数)将返回该类型在 Remote Objects 网络上所有实例的名称列表。例如,如果你在 .rep 文件中定义了一个 Shape 类,且 Circle 和 Square 类继承自 Source 定义,则可以通过enableRemoting 在 Remote Objects 网络上共享它们。

Square square;
Circle circle;
myHost.enableRemoting(&square, "Square");
myHost.enableRemoting(&circle, "Circle");

随后可通过该实例查找可用的 Shape 实例。

QStringList instances = clientNode.instances<Shape>();
// will return a QStringList containing "Circle" and "Square"
auto instance1 = clientNode.acquire<Shape>("Circle");
auto instance2 = clientNode.acquire<Shape>("Square");
...

QStringList QRemoteObjectNode::instances(QStringView typeName) const

此便捷函数与模板版本返回相同的结果,但将源类的名称作为参数(typeName ),而非从类类型推导出来。

该函数重载了 `QRemoteObjectNode::instances()`。

QRemoteObjectNode::ErrorCode QRemoteObjectNode::lastError() const

返回最后一个错误集。

[signal, since 6.12] void QRemoteObjectNode::persistedStoreChanged(QRemoteObjectAbstractPersistedStore *persistedStore)

当persistedStore 属性变为persistedStore 时,会触发此信号。

注意: 这是属性persistedStore 的通知器 信号。

该函数自 Qt 6.12 起引入。

void QRemoteObjectNode::registerExternalSchema(const QString &schema, QRemoteObjectNode::RemoteObjectSchemaHandler handler)

提供自定义方法来处理外部提供的模式

该方法与注册表和外部模式相关联。通过为外部模式注册一个 std::function 处理程序,当注册表收到通知,得知您已获取的源(Source)可用时,将调用该注册的方法。如果不进行此注册,QtRO 只能处理“内置”模式。

当注册表检测到某个新(尚未连接)节点上的Source对象具有 {QUrl::schema()} 为schema 时,将调用提供的方法handler 。 类型为QRemoteObjectNode::RemoteObjectSchemaHandler 的handler 将接收提供该Source的 Node 的QUrl 作为输入参数,并负责建立通信通道(某种形式的QIODevice ),并使用该通道调用addClientSideConnection 。

另请参阅 RemoteObjectSchemaHandler 。

const QRemoteObjectRegistry *QRemoteObjectNode::registry() const

如果该节点正在使用注册表功能,则返回指向该节点QRemoteObjectRegistry 的指针;否则返回nullptr 。

[signal, since 6.12] void QRemoteObjectNode::registryUrlChanged(const QUrl &registryUrl)

当registryUrl 属性变为registryUrl 时,会触发此信号。

注意: 这是属性registryUrl的通知器 信号。

该函数在 Qt 6.12 中引入。

[signal] void QRemoteObjectNode::remoteObjectAdded(const QRemoteObjectSourceLocation &loc)

每当向注册表(Registry)添加一个新的源(Source)对象时,都会触发此信号。如果未设置注册表(即通过connectToNode 直接建立的连接上的源),则不会触发此信号。loc 参数包含有关所添加源的信息,包括名称、类型以及托管节点的QUrl 。

另请参阅 remoteObjectRemoved() 和instances()。

[signal] void QRemoteObjectNode::remoteObjectRemoved(const QRemoteObjectSourceLocation &loc)

每当已知的Source对象从 Registry 中移除时,都会发出此信号。如果未设置 Registry(即通过connectToNode 直接建立连接的 Sources),则不会发出此信号。loc 参数包含有关被移除的 Source 的信息,包括名称、类型以及托管节点的QUrl 。

另请参阅 remoteObjectAdded 和instances 。

[virtual] void QRemoteObjectNode::setName(const QString &name)

将name 设置为该节点的内部名称。该名称随后将作为日志的一部分输出(如果已启用日志功能)。此功能在合并多个节点的日志数据时尤为有用。

[override virtual protected] void QRemoteObjectNode::timerEvent(QTimerEvent *)

重写了:QObject::timerEvent(QTimerEvent *event)。

bool QRemoteObjectNode::waitForRegistry(int timeout = 30000)

阻塞直至该节点的注册表初始化完成,或timeout (以毫秒为单位)超时。如果返回时注册表已成功初始化,则返回true ;否则返回false 。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.