QRemoteObjectHostBase Class

QRemoteObjectHostBase クラスは、Host およびRegistryHost クラスに共通する基本機能を提供します。詳細...

ヘッダー #include <QRemoteObjectHostBase>
CMake: find_package(Qt6 REQUIRED COMPONENTS RemoteObjects)
target_link_libraries(mytarget PRIVATE Qt6::RemoteObjects)
qmake: QT += remoteobjects
を継承する: QRemoteObjectNode
によって継承される:

QRemoteObjectHost そしてQRemoteObjectRegistryHost

パブリックな型

enum 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 &registryUrl, 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 は、直接インスタンス化できない基本クラスです。このクラスは、すべてのホストノード (HostRegistryHost) で共有されるenableRemotingdisableRemoting の機能と、Sourceオブジェクトを Remote Objects ネットワークに公開するために必要なロジックを提供します。

メンバ タイプ ドキュメント

enum QRemoteObjectHostBase::AllowedSchemas

この列挙型は、NodeがhostUrlに認識できないスキーマを持つurlを受け入れるかどうかを指定するために使用します。デフォルトでは、既知のスキーマを持つ url のみを受け付けますが、AllowExternalRegistration を使用することで、レジストリが外部の (QtRO にとっての) url をクライアントの Node に渡すことができるようになります。

定数説明
QRemoteObjectHostBase::BuiltInSchemasOnly0QtRO がサポートしているスキーマにのみ hostUrl を設定できるようにします。これはデフォルト値で、認識できないスキーマが指定された場合はノードエラーとなります。
QRemoteObjectHostBase::AllowExternalRegistration1提供されたスキーマは外部スキーマとして登録されます。

QRemoteObjectHostも参照してください

メンバ関数ドキュメント

void QRemoteObjectHostBase::addHostSideConnection(QIODevice *ioDevice)

外部QIODevices上でソース・オブジェクトをQRemoteObjectHost::enableRemoting ()するには、Qt Remote Objects 、それぞれのノード間の通信チャネル(QIODevice )にアクセスする必要がある。ソース側でこれを可能にするのは、ioDevice を入力とする addHostSideConnection() 呼び出しです。addHostSideConnection を呼び出さなくても、enableRemoting() 呼び出しは機能しますが、Replica ノードへの接続が提供されない限り、Node はSourceオブジェクトを共有できません。この関数を呼び出す前に、一意の URL とAllowExternalRegistration を指定してsetHostUrl() を呼び出す必要があります。

addClientSideConnectionも参照してください

[invokable] bool QRemoteObjectHostBase::disableRemoting(QObject *remoteObject)

QObject remoteObject のリモートアクセスを無効にします。現在のノードがクライアント・ノードである場合、またはremoteObject が登録されていない場合はfalse を返し、Source オブジェクトのリモーティングが正常に無効化された場合はtrue を返します。

警告: 警告: このメソッドを呼び出すと、このオブジェクトのレプリカは無効になります。

注意: この関数はメタオブジェクトシステムやQMLから呼び出すことができます。Q_INVOKABLE を参照してください。

enableRemoting()も参照してください

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

このテンプレート化された関数オーバーロードは、ホストノードが、指定された(コンパイル時にチェックされた)インターフェイスを持つQObject object へのリモートアクセスを提供することを可能にする。このオブジェクトをホストするノードに接続されたクライアントノードは、このソースのレプリカを取得することができます。

これは、例によって最もよく説明されます:

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

ここでは、MinuteTimerSourceAPIは、TimeModel.repファイルによって定義されたSignals/Slot/Propertiesのセットである。コンパイル時のチェックは、入力QObject が要求された API を公開できることを確認するために行われる。そうでない場合はコンパイルに失敗します。これにより、object 'のインターフェースのサブセットが公開され、Signal/Slot接続でサポートされるタイプの変換が可能になります。

現在のノードがクライアントノードである場合、またはQObject がすでにリモートに登録されている場合はfalse を返し、QObject に対してリモートが正常に有効になっている場合はtrue を返す。

disableRemoting()も参照してください

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

ホストノードがQObject object へのリモートアクセスを動的に提供できるようにします。このオブジェクトをホストするノードに接続されたクライアントノードは、このソースのレプリカを取得できます。

オプションのname は、QRemoteObjectNode::acquire() を使用してQObject を取得できるルックアップ名を定義します。明示的に設定されていない場合は、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)

この enableRemoting() のオーバーロードは、QAbstractItemModel 型(またはQAbstractItemModel から派生した型)に固有です。これは、モデルとそのモデルの HMI を異なるプロセスで使用したい場合に便利です。

必要なパラメータは、model 自身、モデルを検索するためのname 、そして Replica 側で公開するroles の 3 つです。Sourceと Replicaの間で選択を同期させたい場合は、オプションのパラメータselectionModel 。これは単一のReplicaを使用する場合にのみ推奨されます。

裏側では、Qt Remote Objects が data() 検索をバッチ処理し、可能な場合はデータをプリフェッチすることで、モデルのインタラクションを可能な限り応答性の高いものにします。

現在のノードがクライアント・ノードである場合、またはQObject がすでにリモートに登録されている場合はfalse を返し、QAbstractItemModel に対してリモートが正常に有効になっている場合はtrue を返します。

disableRemoting()も参照してください

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

別のネットワークからリモートオブジェクトを転送

プロキシ機能は、ソースオブジェクトを複数のネットワークで共有したい場合に便利です。例えば、組み込みターゲットでターゲットのみの接続(ローカルのような)を使用していて、 同じオブジェクトのいくつかを外部で利用できるようにしたい場合です。

具体的な例として、ターゲット ハードウェア上でレジストリを使用して互いに通信している一連のプロセスがあり、レジストリが"local:registry" にあり、ソースオブジェクトを保持するノードが "local:MyHost" にあるとします。これらのオブジェクトにtcpでアクセスしたい場合は、このように新しいproxyNodeを作成します:

// 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にノードを作成し、このノードは(やはり内部的/自動的に)提供されたレジストリ(この例では "local:registry "というregistryUrl パラメータで与えられる)に接続する。local:registryがremoteObjectAdded シグナルを発するたびに、QRemoteObjectSourceLocation は、プロキシ呼び出しに与えられたfilter に渡される。このメソッドがtrueを返すと(デフォルトのフィルタは、フィルタリングなしで単にtrueを返す)、内部ノードからオブジェクトが取得()され、enableRemoting()が(レプリカが初期化されると)proxyNode上で呼び出される。

hostUrl が提供されている場合 (reverseProxy を有効にするために必要ですが、それ以外は必要ありません)、内部ノードは、提供されたアドレスで構成されたQRemoteObjectHost ノードとなります。hostUrl が提供されない場合、内部ノードは(HostNode ではなく)QRemoteObjectNode になります。

オブジェクトが内部ノードから取得された場合、true を返します。

reverseProxy()も参照してください

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

リモート・オブジェクトを別のネットワークに転送する。

reverseProxy()関数を使用すると、proxy()関数を拡張することができ、実質的にプロキシ機能を "逆方向 "にミラーリングすることができます。ノードの通信は対称ではないため、一方がSourceオブジェクトでenableRemoting() を呼び出すと、もう一方がReplica を取得するためにacquire() を呼び出します。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() 機能では、別のネットワーク上のソース・オブジェクトを取得()できますが、reverseProxy() では、アクセスできないネットワークにソース・オブジェクトを「プッシュ」できます。

注意: proxy() は reverseProxy() の前に呼び出す必要があり、reverseProxy() が動作するためには、proxy に hostUrl を指定する必要があります。reverseProxy()メソッドでは、filter 。この reverseProxy 固有のフィルタは、proxyNode 上の新しいSourceオブジェクトの通知を受信し、filter を通過した場合に内部ノードで取得します。

成功すればtrue を返し、そうでなければfalse を返します。

注: 現在、リバースプロキシ機能はQRemoteObjectRegistryHost に対してのみサポートされています。QRemoteObjectHost ノードでこのメソッドを呼び出すと、常にfalse が返されます。

proxy()も参照してください

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

再実装:QRemoteObjectNode::setName(const QString &name)。

QObject::setObjectName() (このメソッドが呼び出す) と似ていますが、このバージョンはname を内部クラスにも適用します。

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