Exemple 2 : Connexion directe avec un réplica dynamique

Il n'y a pas de changement à faire du côté de la source, car une réplique dynamique n'a d'impact que sur la façon dont le nœud demandeur acquiert la réplique. Nous utilisons donc le code côté source présenté dans l'exemple 1.

  1. Ajouter la génération de répliques au projet.

    Comme la réplique est acquise dynamiquement, aucun fichier .rep n'est nécessaire, contrairement à l'exemple 1.

  2. Créer le nœud distant et le connecter au nœud hôte source.

    Le code de cette étape est inchangé par rapport à l'exemple 1.

    QRemoteObjectNode repNode; // create remote object node
    repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node
  3. Acquérir une réplique de l'objet source distant.

    Dans main.cpp, nous utilisons un QSharedPointer pour contenir une réplique de l'objet distant, puis nous instancions un objet demandeur de réplique :

    #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();
    }

La déclaration et la définition complètes de la classe du demandeur, DynamicClient, sont les suivantes :

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"// constructeurDynamicClient::DynamicClient(QSharedPointer<QRemoteObjectDynamicReplica> ptr) : QObject(nullptr), clientSwitchState(false), reptr(ptr) { //signal de connexion pour la réplique valide changé avec l'initialisation du slot de signal   QObject::connect(reptr.data(), &QRemoteObjectDynamicReplica::initialized, this, &DynamicClient::initConnection_slot) ; }// Fonction d'initialisation des connexions entre les slots et les signauxvoid DynamicClient::initConnection_slot() { // Connecter le signal currStateChanged() de la réplique source avec le  slot // recSwitchState()  du client  pour recevoir l'état actuel de la source: QObject::connect(reptr.data(), SIGNAL(currStateChanged(bool)), this,SLOT(recSwitchState_slot(bool))) ; // Connecter le signal echoSwitchState(..) du client avec le  slot // server_slot(..)  de la réplique  pour renvoyer l'état reçu :QObject::connect(this, SIGNAL(echoSwitchState(bool)), reptr.data(), SLOT(server_slot(bool)) ; }void DynamicClient::recSwitchState_slot(bool value) { // Utiliser la propriété de la réplique pour obtenir "currState" de la source :clientSwitchState =  reptr->property("currState").toBool() ;    qDebug() << "Received source state " << value << clientSwitchState;
   // Émission d'un signal pour renvoyer l'état reçu au serveur :Q_EMIT echoSwitchState(clientSwitchState) ; }

Lorsqu'il est exécuté en même temps que l'exemple côté source, le résultat est identique à celui de l'exemple 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.