QRemoteObjectNode 类

Qt 远程对象网络的节点。 更多...

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

QRemoteObjectHostBase

公共类型

枚举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 = {})
voidaddClientSideConnection(QIODevice *ioDevice)
boolconnectToNode(const QUrl &address)
intheartbeatInterval() const
QStringListinstances() const
QStringListinstances(QStringView typeName) const
QRemoteObjectNode::ErrorCodelastError() const
QRemoteObjectAbstractPersistedStore *persistedStore() const
voidregisterExternalSchema(const QString &schema, QRemoteObjectNode::RemoteObjectSchemaHandler handler)
const QRemoteObjectRegistry *registry() const
QUrlregistryUrl() const
voidsetHeartbeatInterval(int interval)
virtual voidsetName(const QString &name)
voidsetPersistedStore(QRemoteObjectAbstractPersistedStore *persistedStore)
virtual boolsetRegistryUrl(const QUrl &registryAddress)
boolwaitForRegistry(int timeout = 30000)

信号

voidheartbeatIntervalChanged(int heartbeatInterval)
voidremoteObjectAdded(const QRemoteObjectSourceLocation &loc)
voidremoteObjectRemoved(const QRemoteObjectSourceLocation &loc)

重写的保护函数

virtual voidtimerEvent(QTimerEvent *) override

详细描述

QRemoteObjectNode类提供了一个访问QtRemoteObjects网络的入口点。一个网络可以从两个节点这样简单,到一个任意复杂的过程和设备的集合。

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

节点可以使用connectToNode直接连接,或者可以使用QRemoteObjectRegistry来简化连接。

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

另请参阅QRemoteObjectHostQRemoteObjectRegistryHost

成员类型文档

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

用于接受QUrl输入的std::function方法的类型定义,负责创建此节点与承载所期望的Source节点的通信通道。由于某些类型的QIODevices(例如,QSslSocket)在使用前需要额外的步骤,此方法负责在连接完全建立后调用addClientSideConnection

属性文档

heartbeatInterval : int

心跳间隔(以毫秒为单位)。

心跳(对于套接字连接有用)将定期向已连接节点发送消息,以检测连接是否中断。Qt远程对象会在检测到连接丢失时尝试自动重新连接。此函数可以帮助检测这一点,因为客户端只有在尝试发送数据时会检测到服务器不可用。

0(默认值)将禁用心跳。

访问函数

intheartbeatInterval() const
voidsetHeartbeatInterval(int interval)

通知信号

voidheartbeatIntervalChanged(int heartbeatInterval)

persistedStore : QRemoteObjectAbstractPersistedStore*

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

允许复制PROP成员具有PERSISTED属性,以便在复制被删除时保存其当前值,并且在复制下一次启动时恢复存储的值。

需要QRemoteObjectAbstractPersistedStore类的实现来控制持久性在哪里以及如何处理。

访问函数

QRemoteObjectAbstractPersistedStore *persistedStore() const
voidsetPersistedStore(QRemoteObjectAbstractPersistedStore *persistedStore)

registryUrl : QUrl

此属性包含此节点使用的Registry的地址。

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

访问函数

QUrlregistryUrl() const
virtual boolsetRegistryUrl(const QUrl &registryAddress)

成员函数文档

QRemoteObjectNode::QRemoteObjectNode(QObject *parent = nullptr)

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

另请参阅connectToNodesetRegistryUrl

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

连接到QRemoteObjectRegistryRegistry的QRemoteObjectNode。以这种方式构建的节点无法连接,因此无法在网络上公开Source对象。找到并连接到其他(主机)节点由指定的registryAddressQRemoteObjectRegistry处理。

也参见 connectToNodesetRegistryUrlQRemoteObjectHost 以及 QRemoteObjectRegistryHost

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

返回一个类型为 ObjectiveType(这是一个模板参数,必须继承自 QRemoteObjectReplica)的副本指针。也就是说,模板参数必须是一个由 -repc 生成的类型。可以使用 name 参数来指定在 QRemoteObjectHost::enableRemoting() 调用期间给对象指定的 name

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

返回源 name 对应的 QRemoteObjectDynamicReplica

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

返回一个特定由 QAbstractItemModel 派生的 Replica 指针。提供的 name 必须与将 Model 放入网络匹配的 enableRemoting() 使用的 name 匹配。action 指定模型是否在发出 initialized 信号之前加载数据。如果设置为 QtRemoteObjects::PrefetchData,则预先加载 rolesHint 中角色的数据。如果 rolesHint 为空,则将预先加载 Source 曝光的全部角色的数据。

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

void QRemoteObjectNode::addClientSideConnection(QIODevice *ioDevice)

为了通过 External QIODevices 使用 QRemoteObjectNode::acquire() 访问 Replica 对象,Qt Remote Objects 需要访问节点之间的通信通道(一个 QIODevice)。使用 ioDevice 作为输入的 addClientSideConnection() 调用可以启用此功能。在未调用 addClientSideConnection 的情况下进行任何 acquire() 调用仍将工作,但节点将无法在没有提供到主机节点的连接的情况下初始化 Replica

也参见 QRemoteObjectHostBase::addHostSideConnection

[可调用] 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类从源定义中继承,则可以使用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

此函数重载了instance()。

这个便利函数提供与模板版本相同的结果,但将源类名称(typeName)作为参数,而不是从类类型中推导。

QRemoteObjectNode::ErrorCode QRemoteObjectNode::lastError() const

返回设置的最后一个错误。

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

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

此方法与注册表外部模式关联。通过为外部模式注册std::function处理器,当注册表通知您已获取的源可用时,将调用注册的方法。不进行此注册,QtRO将只能处理“内置”的模式。

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

另请参阅:RemoteObjectSchemaHandler

const QRemoteObjectRegistry *QRemoteObjectNode::registry() const

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

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

每当一个新的 对象添加到注册表时,都会发出此信号。如果没有设置注册表(即通过 connectToNode 直接连接的源),则不会发出信号。参数 loc 包含有关已添加源的详细信息,包括名称、类型和宿主节点的 QUrl

另请参阅remoteObjectRemoved() 和 instances

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

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

另请参阅remoteObjectAddedinstances

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

name 设置为该节点的内部名称。然后将其输出为日志的一部分(如果已启用)。这在从多个节点合并日志数据时非常有用。

[覆盖虚拟受保护] void QRemoteObjectNode::timerEvent(QTimerEvent *)

重新实现了: QObject::timerEvent(QTimerEvent *event).

bool QRemoteObjectNode::waitForRegistry(int timeout = 30000)

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

© 2024 Qt 公司。此处包含的文档贡献的版权属于其各自的拥有者。此处提供的文档受 GNU 自由文档许可证版本 1.3 的许可,由自由软件基金会发布。Qt 和相应的标志是芬兰和/或其他国家的 Qt 公司的商标。所有其他商标均为其各自所有者的财产。