Erste Schritte mit Qt Remote Objects
Einführung
Das Modul Qt Remote Objects bietet eine einfache Möglichkeit, Qt-APIs zwischen Prozessen und Geräten auszutauschen. Damit dies funktioniert, benötigen wir einen Datenkanal zwischen Prozessen und Geräten. Um diesen Datenkanal einzurichten, benötigen Sie zunächst einen QRemoteObjectNode.
In QtRO ist ein Knoten ein Endpunkt für die Kommunikation. In einem Netzwerk für entfernte Objekte benötigt jeder Teilnehmer, sei es ein Prozess oder ein Gerät, seinen eigenen Knoten. QtRO ist ein Peer-to-Peer-Netzwerk, wobei die verbundenen Knoten die Glieder des Netzwerks sind.
Knoten an sich bieten nicht viel Nutzen. Aber ihr Wert entsteht, wenn Sie QObject Klassen zu einem Knoten hinzufügen, um sie gemeinsam zu nutzen. Dann kann jeder Peer-Knoten eine Kopie oder Instanz des gemeinsam genutzten Objekts vom Host-Knoten, dem Knoten, der es gemeinsam nutzt, anfordern.
Anders als bei der Verwendung normaler Klasseninstanzen (mit unabhängigen Eigenschaften und Signalemissionen) synchronisiert QtRO automatisch Änderungen am gemeinsam genutzten Objekt über alle seine Kopien hinweg. Bis auf wenige Ausnahmen verfügen diese Kopien über die gleiche Qt-API wie das Originalobjekt und sollen genau so verwendet werden, als ob das Originalobjekt vorhanden wäre.
In QtRO wird das Originalobjekt als Quelle bezeichnet. Es ist eine vollständig implementierte C++-Klasse mit der notwendigen Geschäftslogik, um die erforderliche Funktionalität bereitzustellen. Kopien dieses Objekts werden als Replikatebezeichnet. Für ein Replikat brauchen Sie keinen C++-Code zu schreiben; Sie fordern stattdessen eine Instanz von einem Knoten an. Sie benötigen zwar etwas Code, um das Replikat zu verwenden, wie z. B. das Verbinden von Signalen mit Ihren eigenen Slots, aber Sie brauchen das interne Verhalten nicht zu implementieren - das ist bereits in der Quelle für Sie erledigt.
Da sich der Quellcode in einem anderen Prozess oder sogar auf einem anderen Gerät befinden kann, gibt es in QtRO Faktoren, die Sie berücksichtigen müssen, auf die Sie bei einer Entwicklung ohne Interprozesskommunikation (IPC) normalerweise nicht stoßen würden. Insbesondere, was passiert, wenn der Prozess oder das Gerät nicht vorhanden ist? Hier kommen die Ergänzungen zur Replica-API ins Spiel:
- Das initialized()-Signal wird ausgegeben, sobald das Replikat den Quellstatus vom QtRO-Netzwerk erhalten hat.
- Sowohl die Eigenschaft isReplicaValid als auch das Signal stateChanged() warnen Sie, wenn die Verbindung unterbrochen wird.
Objekte, die über QtRO gemeinsam genutzt werden, verwenden die Verbindungen (Conduits) zwischen den Knoten für die gesamte Kommunikation. Wenn Sie ein QObject gemeinsam nutzen möchten, müssen Sie einen Host-Knoten mit einer URL erstellen, mit der sich andere Knoten verbinden können. Sie können auch die Registry verwenden, um Verbindungen zu erleichtern, aber Ihre Knoten, die Quellen gemeinsam nutzen, müssen trotzdem Host-Knoten sein. Jedem gemeinsam genutzten Objekt wird ein Name ( QString) gegeben, der zur Identifizierung im QtRO-Netzwerk dient.
Implementierung
Um die Verwendung von Remote-Objekten zu veranschaulichen, müssen wir auf der Quellenseite Folgendes tun:
- Erstellen des Quellobjekts, das auf andere Knoten repliziert wird, mit oder ohne Verwendung von repc, dem Qt Remote Objects Compiler.
- Erstellen Sie optional die Registry. Andernfalls verwenden Sie direkte Verbindungen.
- Erstellen Sie einen Host-Knoten, damit das Quellobjekt gemeinsam genutzt werden kann.
- Rufen Sie die Funktion enableRemoting() des Knotens auf, um das Quellobjekt freizugeben.
Auf der Replikat-Seite müssen wir das tun:
- Optional, verwenden Sie repc, um einen Replica-Header für Ihr Projekt zu generieren.
- Erstellen Sie den Knoten, der sich mit dem Quell-Host-Knoten verbinden wird.
- Die Funktion acquire() des Knotens aufrufen, um einen Zeiger auf ein Replikat zu erstellen.
Die folgenden Beispiele illustrieren sowohl repc-kompilierte statische Objekte als auch dynamische Quellobjekte. Außerdem zeigen sie sowohl direkte Verbindungen als auch Verbindungen, die eine Registry zwischen Knoten verwenden.
© 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.