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 |
| 継承元: |
パブリック型
| 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 ®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 の機能に加え、Remote Objects ネットワーク上でSourceオブジェクトを公開するために必要なロジックを提供します。
メンバ型のドキュメント
enum QRemoteObjectHostBase::AllowedSchemas
この列挙型は、NodeがhostUrlとして認識されないスキーマを持つURLを受け入れるかどうかを指定するために使用されます。デフォルトでは、既知のスキーマを持つURLのみが受け入れられますが、AllowExternalRegistration を使用すると、レジストリが(QtROにとって)外部のURLをクライアントNodeに渡すようになります。
| 定数 | 値 | 説明 |
|---|---|---|
QRemoteObjectHostBase::BuiltInSchemasOnly | 0 | hostUrl の設定を QtRO がサポートするスキーマに限定します。これがデフォルト値であり、認識されないスキーマが指定された場合、Node エラーが発生します。 |
QRemoteObjectHostBase::AllowExternalRegistration | 1 | 指定されたスキーマは外部スキーマとして登録されます |
QRemoteObjectHostも参照してください 。
メンバ関数のドキュメント
void QRemoteObjectHostBase::addHostSideConnection(QIODevice *ioDevice)
外部QIODeviceを介してQRemoteObjectHost::enableRemoting()でSourceオブジェクトを共有するには、Qt Remote Objects が各ノード間の通信チャネル(QIODevice )にアクセスできる必要があります。Source側でこれを有効にするのはaddHostSideConnection()の呼び出しであり、この際、ioDevice が入力として渡されます。enableRemoting() の呼び出しは、addHostSideConnection() を呼び出さなくても動作しますが、レプリカノードへの接続が提供されない限り、ノードはソースオブジェクトを共有できません。この関数を呼び出す前に、一意の 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はApiDefinition であり、TimeModel.repファイルで定義されたシグナル/スロット/プロパティの集合を表しています。入力となるQObject が要求されたAPIを公開できるかどうかを検証するためにコンパイル時のチェックが行われ、そうでない場合はコンパイルに失敗します。 これにより、object のインターフェースの一部のみを公開することが可能となり、シグナル/スロット接続でサポートされる変換の種類も指定できます。
現在のノードがクライアントノードである場合、または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 を別々のプロセスに配置したい場合に役立ちます。
必要な3つのパラメータは、model 自体、モデルを検索するためのname 、およびレプリカ側で公開すべきroles です。ソースとレプリカ間で選択内容を同期させたい場合は、オプションのselectionModel パラメータを使用できます。これは、レプリカが1つの場合のみ推奨されます。
内部的には、Qt Remote Objects は data() による検索をバッチ処理し、可能な場合はデータをプリフェッチすることで、モデルとのやり取りの応答性を最大限に高めています。
現在のノードがクライアントノードである場合、またはQObject がすでにリモート化用に登録されている場合はfalse を返し、QAbstractItemModel に対してリモート化が正常に有効化された場合はtrue を返します。
disableRemoting()も参照してください 。
bool QRemoteObjectHostBase::proxy(const QUrl ®istryUrl, 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内にノードが作成され、そのノードは(これも内部的かつ自動的に)指定されたレジストリ(registryUrl パラメータで指定されたもの、この例では「local:registry」)に接続されます。 local:registryがremoteObjectAdded シグナルを発行するたびに、QRemoteObjectSourceLocation がプロキシ呼び出しで指定されたfilter に渡されます。このメソッドがtrueを返した場合(デフォルトのフィルタはフィルタリングを行わずに単にtrueを返します)、内部ノードからオブジェクトがacquired()され、proxyNode上でenableRemoting()が(レプリカが初期化され次第)呼び出されます。
hostUrl が指定された場合(reverseProxy を有効にするには必須ですが、それ以外の場合は不要です)、内部ノードは指定されたアドレスで設定されたQRemoteObjectHost ノードになります。hostUrl が指定されていない場合、内部ノードはQRemoteObjectNode (HostNodeではありません)になります。
オブジェクトが内部ノードから取得された場合、true を返します。
reverseProxy()も参照してください 。
bool QRemoteObjectHostBase::reverseProxy(QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](QStringView, QStringView) {return true; })
リモートオブジェクトを別のネットワークに転送します。
reverseProxy()関数を使用すると、proxy()の機能を拡張でき、実質的にプロキシ機能を「逆方向」にミラーリングすることができます。これらは異なる機能です。なぜなら、ノード間の通信は対称的ではなく、一方がSourceオブジェクトを使用してenableRemoting()を呼び出し、もう一方がacquire()を呼び出してReplicaを取得するからです。proxy() を使用すると、acquire を通じてターゲットデバイス上のオブジェクトをリモートで「監視」できますが、ターゲット外のSourceオブジェクトをデバイスの local:* ネットワークから取得することはできません。そこで 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() の機能では、別のネットワーク上のソースオブジェクトを取得(acquire())できますが、reverseProxy() を使用すると、通常はアクセスできないネットワークにソースオブジェクトを「プッシュ」することができます。
注: reverseProxy() を呼び出す前にproxy() を呼び出す必要があり、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 を適用します。
© 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.