不用改变 Source (源) 侧,作为动态 复本 只影响请求者节点如何获得 Replica (复本)。所以,使用的 Source (源) 侧代码展示在 范例 1 .
把 Replica (复本) 生成添加到工程。
因为 Replica (复本) 是动态获得的,非
.rep
文件的要求不像在
范例 1
.
Create the remote node and connect it to the source host node.
The code for this step is unchanged from 范例 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.
在
main.cpp
,使用
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
如下:
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 范例 1 .