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.
SélectionnezQRemoteObjectNode repNode;// create remote object noderepNode.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:
Sélectionnez#include <QCoreApplication>#include"dynamicclient.h"intmain(intargc,char*argv[]){QCoreApplication a(argc, argv); QSharedPointer<QRemoteObjectDynamicReplica> ptr;// shared pointer to hold replicaQRemoteObjectNode repNode; repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); ptr.reset(repNode.acquireDynamic("SimpleSwitch"));// acquire replica of source from host nodeDynamicClient rswitch(ptr);// create client switch object and pass replica reference to itreturna.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
};
#endifdynamicclient.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.


