Beispiel 2: Direkte Verbindung mit einer dynamischen Replik
Auf der Quellseite müssen keine Änderungen vorgenommen werden, da ein dynamisches Replikat nur Auswirkungen darauf hat, wie der anfordernde Knoten das Replikat erwirbt. Wir verwenden also den in Beispiel 1 gezeigten Code auf der Quellseite.
- Fügen Sie dem Projekt die Erzeugung von Replikaten hinzu.
Da das Replikat dynamisch erworben wird, ist im Gegensatz zu Beispiel 1 keine
.rep
Datei erforderlich. - Erstellen Sie den entfernten Knoten und verbinden Sie ihn mit dem Quellhostknoten.
Der Code für diesen Schritt ist gegenüber Beispiel 1 unverändert.
QRemoteObjectNode repNode; // create remote object node repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node
- Erwerben Sie ein Replikat des entfernten Quellobjekts.
In
main.cpp
verwenden wir QSharedPointer, um ein Replikat des entfernten Objekts zu speichern, und instanziieren dann ein Replikat-Anforderungsobjekt:#include <QCoreApplication> #include "dynamicclient.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSharedPointer<QRemoteObjectDynamicReplica> ptr; // shared pointer to hold replica QRemoteObjectNode repNode; repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); ptr.reset(repNode.acquireDynamic("SimpleSwitch")); // acquire replica of source from host node DynamicClient rswitch(ptr); // create client switch object and pass replica reference to it return a.exec(); }
Die vollständige Deklaration und Definition der Requestor-Klasse, DynamicClient
, lautet wie folgt:
dynamicclient.h
#ifndef _DYNAMICCLIENT_H #define _DYNAMICCLIENT_H #include <QObject> #include <QSharedPointer> #include <QRemoteObjectNode> #include <qremoteobjectdynamicreplica.h> class DynamicClient : public QObject { Q_OBJECT public: DynamicClient(QSharedPointer<QRemoteObjectDynamicReplica> ptr); ~DynamicClient() override = default; Q_SIGNALS: void echoSwitchState(bool switchState);// this signal is connected with server_slot(..) slot of source object and echoes back switch state received from source public Q_SLOTS: void recSwitchState_slot(bool); // Slot to receive source state void initConnection_slot(); // Slot to connect signals/slot on replica initialization private: bool clientSwitchState; // holds received server switch state QSharedPointer<QRemoteObjectDynamicReplica> reptr;// holds reference to replica }; #endif
dynamicclient.cpp
#include "dynamicclient.h"// constructorDynamicClient::DynamicClient(QSharedPointer<QRemoteObjectDynamicReplica> ptr) : QObject(nullptr), clientSwitchState(false), reptr(ptr) { //Verbindungssignal für Replikat gültig geändert mit Signal Slot Initialisierung QObject::connect(reptr.data(), &QRemoteObjectDynamicReplica::initialized, this, &DynamicClient::initConnection_slot); }// Funktion zur Initialisierung von Verbindungen zwischen Slots und Signalenvoid DynamicClient::initConnection_slot() { // Verbinden Sie das Signal currStateChanged() des Quellreplikats mit dem Slot // recSwitchState() des Clients , um den aktuellen Zustand der Quelle zu erhalten: QObject::connect(reptr.data(), SIGNAL(currStateChanged(bool)), this,SLOT(recSwitchState_slot(bool))); // Verbinden Sie das Signal echoSwitchState(..) des Clients mit dem // server_slot(..) des Replikats , um den empfangenen Status zurückzusenden: QObject::connect(this, SIGNAL(echoSwitchState(bool)), reptr.data(), SLOT(server_slot(bool))); }void DynamicClient::recSwitchState_slot(bool value) { // Replikat-Eigenschaft verwenden, um "currState" von der Quelle zu erhalten:clientSwitchState = reptr->property("currState").toBool(); qDebug() << "Received source state " << value << clientSwitchState; // Senden Sie ein Signal, um den empfangenen Status an den Server zurückzusenden:Q_EMIT echoSwitchState(clientSwitchState); }
Wenn das Beispiel zusammen mit dem quellseitigen Beispiel ausgeführt wird, ist die Ausgabe identisch mit Beispiel 1.
© 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.