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)
void remoteObjectAdded(const QRemoteObjectSourceLocation &loc)
void remoteObjectRemoved(const QRemoteObjectSourceLocation &loc)

重新实现的受保护函数

virtual void timerEvent(QTimerEvent *) override

详细说明

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

QRemoteObjectNode 没有其他节点可以连接的 url,因此只能获取副本。它不能共享源对象(只有QRemoteObjectHostQRemoteObjectRegistryHost 节点可以共享)。

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

QRemoteObjectRegistry 是一个特殊的副本,可供每个连接到注册表 Url 的节点使用。它知道如何连接到网络上的每个 QRemoteObjectSource 对象。

另请参阅 QRemoteObjectHostQRemoteObjectRegistryHost

成员类型文档

enum QRemoteObjectNode::ErrorCode

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

常量说明
QRemoteObjectNode::NoError0无错误。
QRemoteObjectNode::RegistryNotAcquired1无法获取注册表。
QRemoteObjectNode::RegistryAlreadyHosted2注册表已定义并托管 Sources。
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::函数方法的类型定义,该方法可接受QUrl 输入,并负责在该节点与托管所需源代码的节点之间创建通信通道。由于某些类型的 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)

registryUrl : QUrl

此属性保存此节点使用的Registry 的地址。

如果没有使用注册表,则QUrl 为空。

访问函数:

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

成员函数文档

QRemoteObjectNode::QRemoteObjectNode(QObject *parent = nullptr)

QRemoteObjectNode 的默认构造函数,其给定值为parent 。以这种方式构建的节点无法连接,因此无法在网络上公开源对象。它也不会包含QRemoteObjectRegistry ,除非使用setRegistryUrl 手动设置。

另请参阅 connectToNodesetRegistryUrl

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

连接到 {QRemoteObjectRegistry} {Registry} 的 QRemoteObjectNode。{注册表}。以这种方式构建的节点无法被连接,因此也就无法在网络上公开源对象。查找和连接其他(主机)节点由registryAddress 指定的QRemoteObjectRegistry 处理。

另请参见 connectToNode,setRegistryUrl,QRemoteObjectHostQRemoteObjectRegistryHost

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

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

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

返回QRemoteObjectDynamicReplica 的源name

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公开的所有角色的数据。

在使用初始化之前,返回的模型将是空的。

void QRemoteObjectNode::addClientSideConnection(QIODevice *ioDevice)

为了通过外部 QIOD 设备 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生成的类型作为模板参数)将返回远程对象网络中该类型每个实例的名称列表。例如,如果您在 .rep 文件中定义了一个 Shape 类,而 Circle 和 Square 类继承自 Source 定义,则可使用enableRemoting 在远程对象网络上共享这些类。

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

该函数重载了 instances()。

这个方便的函数提供了与模板版本相同的结果,但它将源类的名称作为参数(typeName ),而不是从类的类型中派生出来。

QRemoteObjectNode::ErrorCode QRemoteObjectNode::lastError() const

返回最后一次错误设置。

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

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

该方法与注册表外部模式相关联。通过为外部模式注册std::函数处理程序,当注册表收到您获取的可用的通知时,注册的方法将被调用。如果没有注册,QtRO 将只能处理 "内置 "模式。

当注册表在一个新节点(尚未连接)上看到一个{QUrl::schema()}为schema对象时,就会调用所提供的方法handler 。类型为QRemoteObjectNode::RemoteObjectSchemaHandlerhandler 将获取提供作为输入参数的节点的QUrl ,并负责建立通信通道(某种QIODevice )和调用addClientSideConnection

另请参见 RemoteObjectSchemaHandler

const QRemoteObjectRegistry *QRemoteObjectNode::registry() const

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

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

每当有新的对象添加到注册表时,就会发出该信号。如果没有设置注册表(即通过connectToNode 直接连接的来源),则不会发出该信号。loc 参数包含已添加源的信息,包括名称、类型和托管节点的QUrl

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

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

每当已知对象从注册表中删除时,就会发出该信号。如果没有设置注册表(即通过connectToNode 直接连接的来源),则不会发出该信号。loc 参数包含被移除源的相关信息,包括名称、类型和托管节点的QUrl

另请参阅 remoteObjectAddedinstances

[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

© 2025 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.