QRemoteObjectHostBase Class
QRemoteObjectHostBase クラスは、Host およびRegistryHost クラスに共通する基本機能を提供します。詳細...
Header: | #include <QRemoteObjectHostBase> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS RemoteObjects) target_link_libraries(mytarget PRIVATE Qt6::RemoteObjects) |
qmake: | QT += remoteobjects |
Inherits: | QRemoteObjectNode |
Inherited By: |
パブリック型
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 の機能と、Sourceオブジェクトを Remote Objects ネットワークに公開するために必要なロジックを提供します。
メンバ タイプ ドキュメント
enum QRemoteObjectHostBase::AllowedSchemas
この列挙型は、ノードがhostUrlに認識できないスキーマを持つurlを受け入れるかどうかを指定するために使用されます。デフォルトでは、既知のスキーマを持つ url のみを受け入れますが、AllowExternalRegistration
を使用すると、レジストリが外部の (QtRO の) url をクライアント Node に渡すことができるようになります。
定数 | 値 | 説明 |
---|---|---|
QRemoteObjectHostBase::BuiltInSchemasOnly | 0 | QtRO がサポートしているスキーマにのみ hostUrl を設定できるようにします。これはデフォルト値で、認識できないスキーマが指定された場合はノードエラーとなります。 |
QRemoteObjectHostBase::AllowExternalRegistration | 1 | 提供されたスキーマは外部スキーマとして登録されます。 |
QRemoteObjectHostも参照してください 。
メンバ関数ドキュメント
void QRemoteObjectHostBase::addHostSideConnection(QIODevice *ioDevice)
外部 QIODevices 上でソースオブジェクトをQRemoteObjectHost::enableRemoting() するために、Qt リモートオブジェクトは、それぞれのノード間の通信チャネル(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 ®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にノードを作成し、このノードは(やはり内部的/自動的に)提供されたレジストリ(この例では "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 を内部クラスにも適用します。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。