Beispiel 2: Direkte Verbindung mit einer dynamischen Replik
Auf der Quellseite sind keine Änderungen erforderlich, da sich ein dynamisches Replikat lediglich darauf auswirkt, wie der anfragende Knoten das Replikat abruft. Daher verwenden wir den in Beispiel 1 gezeigten Code auf der Quellseite.
- Fügen Sie die Replikatgenerierung zum Projekt hinzu.
Da die Replik dynamisch abgerufen wird, ist im Gegensatz zu Beispiel 1 keine „
.rep“-Datei erforderlich. - Erstellen Sie den Remote-Knoten und verbinden Sie ihn mit dem Quell-Host-Knoten.
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 - Rufen Sie eine Replik des Remote-Quellobjekts ab.
In „
main.cpp“ verwenden wir ein „ QSharedPointer “, um eine Replik des Remote-Objekts zu speichern, und instanziieren anschließend ein „ReplicaRequestor“-Objekt:#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
};
#endifdynamicclient.cpp
#include "dynamicclient.h"
// Konstruktor
DynamicClient::DynamicClient(QSharedPointer<QRemoteObjectDynamicReplica> ptr)
: QObject(nullptr), clientSwitchState(false), reptr(ptr)
{
// Signal „connect“ für „replica valid“ wird bei der Initialisierung des Signal-Slots geändert
QObject::connect(reptr.data(), &QRemoteObjectDynamicReplica::initialized, this,
&DynamicClient::initConnection_slot);
}
// Funktion zur Initialisierung von Verbindungen zwischen Slots und Signalen
void DynamicClient::initConnection_slot()
{
// Verbinde das Signal „currStateChanged()“ der Quellreplik mit dem
// Slot „recSwitchState()“ des Clients, um den aktuellen Zustand der Quelle zu empfangen:
QObject::connect(reptr.data(), SIGNAL(currStateChanged(bool)), this,
SLOT(recSwitchState_slot(bool)));
// Verbinde das Signal `echoSwitchState(..)` des Clients mit dem
// `server_slot(..)` der Replik, um den empfangenen Zustand zurückzusenden:
QObject::connect(this, SIGNAL(echoSwitchState(bool)), reptr.data(), SLOT(server_slot(bool)));
}
void DynamicClient::recSwitchState_slot(bool value)
{
// Verwende die Replika-Eigenschaft, um „currState“ von der Quelle abzurufen:
clientSwitchState = reptr->property("currState").toBool();
qDebug() << "Received source state " << value << clientSwitchState;
// Signal senden, um den empfangenen Status an den Server zurückzusenden:
Q_EMIT echoSwitchState(clientSwitchState);
}Bei Ausführung zusammen mit dem Beispiel auf der Quellseite entspricht die Ausgabe der in Beispiel 1.
© 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.