QRemoteObjectHostBase Class

Die Klasse QRemoteObjectHostBase bietet eine gemeinsame Basisfunktionalität für die Klassen Host und RegistryHost. Mehr...

Kopfzeile: #include <QRemoteObjectHostBase>
CMake: find_package(Qt6 REQUIRED COMPONENTS RemoteObjects)
target_link_libraries(mytarget PRIVATE Qt6::RemoteObjects)
qmake: QT += remoteobjects
Vererbt: QRemoteObjectNode
Vererbt von:

QRemoteObjectHost und QRemoteObjectRegistryHost

Öffentliche Typen

enum AllowedSchemas { BuiltInSchemasOnly, AllowExternalRegistration }

Öffentliche Funktionen

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; })

Reimplementierte öffentliche Funktionen

virtual void setName(const QString &name) override

Detaillierte Beschreibung

QRemoteObjectHostBase ist eine Basisklasse, die nicht direkt instanziert werden kann. Sie stellt die Funktionalität von enableRemoting und disableRemoting zur Verfügung, die von allen Host-Knoten (Host und RegistryHost) gemeinsam genutzt wird, sowie die Logik, die erforderlich ist, um Quellobjekte im Remote Objects-Netzwerk freizugeben.

Dokumentation der Mitgliedstypen

enum QRemoteObjectHostBase::AllowedSchemas

Diese Aufzählung wird verwendet, um festzulegen, ob ein Knoten eine URL mit einem nicht erkannten Schema für die hostUrl akzeptiert. Standardmäßig werden nur URLs mit bekannten Schemata akzeptiert, aber die Verwendung von AllowExternalRegistration ermöglicht es der Registry, Ihre externe (an QtRO) URL an Client-Knoten zu übergeben.

KonstanteWertBeschreibung
QRemoteObjectHostBase::BuiltInSchemasOnly0Nur erlauben, dass die hostUrl auf ein von QtRO unterstütztes Schema gesetzt wird. Dies ist der Standardwert und führt dazu, dass ein Node-Fehler gesetzt wird, wenn ein nicht anerkanntes Schema angegeben wird.
QRemoteObjectHostBase::AllowExternalRegistration1Das angegebene Schema wird als externes Schema registriert.

Siehe auch QRemoteObjectHost.

Dokumentation der Mitgliedsfunktionen

void QRemoteObjectHostBase::addHostSideConnection(QIODevice *ioDevice)

Um QRemoteObjectHost::enableRemoting() Quellobjekte über externe QIODevices zu übertragen, benötigt Qt Remote Objects Zugriff auf den Kommunikationskanal ( QIODevice) zwischen den jeweiligen Knoten. Es ist der Aufruf addHostSideConnection(), der dies auf der Quellenseite ermöglicht, wobei die ioDevice als Eingabe dient. Jeder enableRemoting()-Aufruf funktioniert auch ohne den Aufruf von addHostSideConnection, aber der Knoten ist nicht in der Lage, die Quellobjekte freizugeben, ohne die Verbindung zum Replikationsknoten zu erhalten. Bevor Sie diese Funktion aufrufen, müssen Sie setHostUrl() mit einer eindeutigen URL und AllowExternalRegistration aufrufen.

Siehe auch addClientSideConnection.

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

Deaktiviert den Fernzugriff für das QObject remoteObject . Gibt false zurück, wenn der aktuelle Knoten ein Client-Knoten ist oder wenn remoteObject nicht registriert ist, und gibt true zurück, wenn der Fernzugriff für das Quellobjekt erfolgreich deaktiviert wurde.

Warnung: Replikate dieses Objekts sind nach dem Aufruf dieser Methode nicht mehr gültig.

Hinweis: Diese Funktion kann über das Meta-Objektsystem und von QML aus aufgerufen werden. Siehe Q_INVOKABLE.

Siehe auch enableRemoting().

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

Diese Funktionsüberladung ermöglicht einem Host-Knoten den Fernzugriff auf QObject object mit einer bestimmten (und zur Kompilierungszeit geprüften) Schnittstelle. Client-Knoten, die mit dem Knoten verbunden sind, der dieses Objekt hostet, können Replikate dieser Quelle erhalten.

Dies lässt sich am besten anhand eines Beispiels veranschaulichen:

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

Hier ist die MinuteTimerSourceAPI der Satz von Signalen/Slots/Eigenschaften, die durch die Datei TimeModel.rep definiert sind. Bei der Kompilierung wird geprüft, ob die Eingabe QObject die angeforderte API bereitstellen kann, andernfalls wird sie nicht kompiliert. Dadurch kann eine Teilmenge der Schnittstelle von object offengelegt werden, und es sind die von Signal/Slot-Verbindungen unterstützten Konvertierungen möglich.

Gibt false zurück, wenn der aktuelle Knoten ein Client-Knoten ist, oder wenn QObject bereits für die Fernsteuerung registriert ist, und true, wenn die Fernsteuerung für QObject erfolgreich aktiviert wurde.

Siehe auch disableRemoting().

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

Ermöglicht es einem Host-Knoten, dynamisch Fernzugriff auf die QObject object zu gewähren. Client-Knoten, die mit dem Knoten verbunden sind, der dieses Objekt hostet, können Replikate dieser Quelle erhalten.

Das optionale name definiert den Nachschlage-Namen, unter dem QObject mit QRemoteObjectNode::acquire() abgerufen werden kann. Wenn nicht explizit gesetzt, wird der in QCLASSINFO_REMOTEOBJECT_TYPE angegebene Name verwendet. Wenn kein solches Makro für QObject definiert wurde, wird QObject::objectName() verwendet.

Gibt false zurück, wenn der aktuelle Knoten ein Client-Knoten ist, oder wenn QObject bereits für das Remoting registriert ist, und true, wenn das Remoting für das dynamische QObject erfolgreich aktiviert wurde.

Hinweis: Diese Funktion kann über das Meta-Objektsystem und von QML aus aufgerufen werden. Siehe Q_INVOKABLE.

Siehe auch disableRemoting().

bool QRemoteObjectHostBase::enableRemoting(QAbstractItemModel *model, const QString &name, const QList<int> roles, QItemSelectionModel *selectionModel = nullptr)

Diese Überladung von enableRemoting() ist spezifisch für QAbstractItemModel Typen (oder jeden von QAbstractItemModel abgeleiteten Typ). Dies ist nützlich, wenn Sie ein Modell und die HMI für das Modell in verschiedenen Prozessen haben wollen.

Die drei erforderlichen Parameter sind model selbst, name, mit dem das Modell nachgeschlagen werden soll, und roles, das auf der Replica-Seite angezeigt werden soll. Wenn Sie die Auswahl zwischen Quelle und Replikat synchronisieren wollen, kann der optionale Parameter selectionModel verwendet werden. Dies wird nur bei der Verwendung einer einzigen Replik empfohlen.

Hinter den Kulissen stapelt Qt Remote Objects data()-Lookups und holt Daten vor, wenn möglich, um die Modellinteraktion so reaktionsschnell wie möglich zu gestalten.

Gibt false zurück, wenn der aktuelle Knoten ein Client-Knoten ist, oder wenn QObject bereits für die Fernwartung registriert ist, und true, wenn die Fernwartung für QAbstractItemModel erfolgreich aktiviert wurde.

Siehe auch disableRemoting().

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

Weiterleitung von Remote-Objekten aus einem anderen Netzwerk

Die Proxy-Funktionalität ist nützlich, wenn Sie Quellobjekte über mehrere Netzwerke hinweg gemeinsam nutzen wollen. Zum Beispiel, wenn Sie ein eingebettetes Ziel haben, das nur Zielverbindungen verwendet (wie lokal) und Sie einige dieser Objekte extern verfügbar machen wollen.

Ein konkretes Beispiel: Sie haben eine Reihe von Prozessen, die auf Ihrer Zielhardware über eine Registry miteinander kommunizieren, wobei die Registry unter "local:registry" liegt und separate Prozesse einen Knoten unter "local:MyHost" verwenden, der Quellobjekte enthält. Wenn Sie auf diese Objekte zugreifen wollen, aber über tcp, können Sie einen neuen proxyNode wie folgt erstellen:

// 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");

Und von einem anderen Gerät aus erstellen Sie einen weiteren Knoten:

// 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>();

Dieser würde (intern) einen Knoten in proxyNode erstellen, der (wiederum intern/automatisch) eine Verbindung zur bereitgestellten Registry herstellt (angegeben durch den Parameter registryUrl, in diesem Beispiel "local:registry"). Immer wenn local:registry das Signal remoteObjectAdded ausgibt, wird QRemoteObjectSourceLocation an den filter übergeben, der dem Proxy-Aufruf übergeben wird. Wenn diese Methode "true" zurückgibt (der Standardfilter gibt einfach "true" ohne jegliche Filterung zurück), wird das Objekt vom internen Knoten erworben() und enableRemoting() (sobald die Replik initialisiert ist) auf proxyNode aufgerufen.

Wenn ein hostUrl angegeben wird (was erforderlich ist, um reverseProxy zu aktivieren, aber ansonsten nicht benötigt wird), wird der interne Knoten ein QRemoteObjectHost Knoten sein, der mit der angegebenen Adresse konfiguriert ist. Wenn kein hostUrl angegeben wird, ist der interne Knoten ein QRemoteObjectNode (nicht HostNode).

Gibt true zurück, wenn das Objekt vom internen Knoten erworben wurde.

Siehe auch reverseProxy().

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

Leitet entfernte Objekte an ein anderes Netz weiter.

Mit der Funktion reverseProxy() kann die Funktionalität von proxy() erweitert werden, so dass die Proxy-Funktionalität in der "umgekehrten" Richtung gespiegelt wird. Diese sind unterschiedlich, da die Knotenkommunikation nicht symmetrisch ist, eine Seite ruft enableRemoting() mit einem Quellobjekt auf, die andere Seite ruft acquire() auf, um ein Replikat zu erhalten. Die Verwendung von proxy() ermöglicht es Ihnen, Objekte auf einem Zielgerät aus der Ferne über acquire zu "beobachten", aber es erlaubt nicht, Quellobjekte außerhalb des Zielgeräts aus dem lokalen:* Netzwerk des Geräts zu erhalten. An dieser Stelle kommt reverseProxy() ins Spiel. Wenn ein proxyNode auf diese Weise erstellt wird:

// 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();

Und von einem anderen Gerät wird ein anderer Knoten erstellt:

// 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>();

Während die proxy()-Funktionalität es erlaubt, Quellobjekte in einem anderen Netzwerk zu erwerben(), erlaubt reverseProxy() es, Quellobjekte in ein ansonsten unzugängliches Netzwerk zu "schieben".

Hinweis: proxy() muss vor reverseProxy() aufgerufen werden, und eine hostUrl muss an proxy übergeben werden, damit reverseProxy() funktioniert. Die Methode reverseProxy() ermöglicht die Anwendung eines separaten filter. Dieser reverseProxy-spezifische Filter empfängt Benachrichtigungen über neue Quellobjekte auf proxyNode und erfasst sie auf dem internen Knoten, wenn sie den filter passieren.

Bei Erfolg wird true zurückgegeben, andernfalls false.

Hinweis: Derzeit wird die Reverse-Proxy-Funktionalität nur für QRemoteObjectRegistryHost unterstützt. Der Aufruf dieser Methode auf einem QRemoteObjectHost Knoten gibt immer false zurück.

Siehe auch proxy().

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

Reimplements: QRemoteObjectNode::setName(const QString &name).

Ähnlich wie QObject::setObjectName() (das diese Methode aufruft), aber diese Version wendet die name auch auf interne Klassen an, die in einigen der Debugging-Ausgaben verwendet werden.

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