Exemple 2 : Connexion directe à une réplique dynamique

Aucune modification n'est nécessaire côté source, car une réplique dynamique n'a d'incidence que sur la manière dont le nœud demandeur accède à la réplique. Nous utilisons donc le code côté source présenté dans l'exemple 1.

  1. Ajoutez la génération de réplique au projet.

    La réplique étant acquise de manière dynamique, aucun fichier d'.rep ation n'est nécessaire, contrairement à l'exemple 1.

  2. Créez le nœud distant et connectez-le au nœud hôte source.

    Le code correspondant à cette étape est identique à celui de l’exemple 1.

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

    Dans main.cpp, nous utilisons un objet « QSharedPointer » pour contenir une réplique de l’objet distant, puis nous instancions un objet « replica requestor » :

    #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 de 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"

// constructeur
DynamicClient::DynamicClient(QSharedPointer<QRemoteObjectDynamicReplica> ptr)
    : QObject(nullptr), clientSwitchState(false), reptr(ptr)
{
    // Signal de connexion pour la modification de l’état de validité de la réplique, initialisé avec le slot de signal
    QObject::connect(reptr.data(), &QRemoteObjectDynamicReplica::initialized, this,
                     &DynamicClient::initConnection_slot);
}

// Fonction permettant d’initialiser les connexions entre les slots et les signaux
void DynamicClient::initConnection_slot()
{
    // Connecte le signal de la réplique source currStateChanged() au  slot
    // recSwitchState()  du client  afin de 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 au
    // 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 récupérer « currState » depuis la source :
    clientSwitchState = reptr->property("currState").toBool();
    qDebug() << "Received source state " << value << clientSwitchState;
   // Émettre un signal pour renvoyer l'état reçu au serveur :
    Q_EMIT echoSwitchState(clientSwitchState);
}

Lorsqu’il est exécuté conjointement avec 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.