Example 2: Direct Connection with a Dynamic Replica
There are no changes to be made on the source side, as a dynamic Replica only impacts how the requestor node acquires the replica. So, we use the source-side code shown in Example 1.
- Add replica generation to the project.
Because the replica is dynamically acquired, no
.rep
file is required unlike in Example 1. - Create the remote node and connect it to the source host node.
The code for this step is unchanged from Example 1.
QRemoteObjectNode repNode; // create remote object node repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node
- Acquire a replica of the remote source object.
In
main.cpp
, we use a QSharedPointer to hold a replica of the remote object, and then instantiate a replica requestor object:#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(); }
The complete declaration and definition of the requestor class, DynamicClient
, is as follows:
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" // constructor DynamicClient::DynamicClient(QSharedPointer<QRemoteObjectDynamicReplica> ptr) : QObject(nullptr), clientSwitchState(false), reptr(ptr) { //connect signal for replica valid changed with signal slot initialization QObject::connect(reptr.data(), &QRemoteObjectDynamicReplica::initialized, this, &DynamicClient::initConnection_slot); } // Function to initialize connections between slots and signals void DynamicClient::initConnection_slot() { // Connect source replica signal currStateChanged() with client's // recSwitchState() slot to receive source's current state: QObject::connect(reptr.data(), SIGNAL(currStateChanged(bool)), this, SLOT(recSwitchState_slot(bool))); // Connect client's echoSwitchState(..) signal with replica's // server_slot(..) to echo back received state: QObject::connect(this, SIGNAL(echoSwitchState(bool)), reptr.data(), SLOT(server_slot(bool))); } void DynamicClient::recSwitchState_slot(bool value) { // Use replica property to get "currState" from source: clientSwitchState = reptr->property("currState").toBool(); qDebug() << "Received source state " << value << clientSwitchState; // Emit signal to echo received state back to server: Q_EMIT echoSwitchState(clientSwitchState); }
When run together with the source-side example, the output is identical to Example 1.