Beispiel 2: Direkte Verbindung mit einer dynamischen Replik

Auf der Quellseite sind keine Änderungen erforderlich, da sich ein dynamisches Replikat lediglich darauf auswirkt, wie der anfragende Knoten das Replikat abruft. Daher verwenden wir den in Beispiel 1 gezeigten Code auf der Quellseite.

  1. Fügen Sie die Replikatgenerierung zum Projekt hinzu.

    Da die Replik dynamisch abgerufen wird, ist im Gegensatz zu Beispiel 1 keine „ .rep “-Datei erforderlich.

  2. Erstellen Sie den Remote-Knoten und verbinden Sie ihn mit dem Quell-Host-Knoten.

    Der Code für diesen Schritt ist gegenüber Beispiel 1 unverändert.

    QRemoteObjectNode repNode; // create remote object node
    repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node
  3. Rufen Sie eine Replik des Remote-Quellobjekts ab.

    In „ main.cpp “ verwenden wir ein „ QSharedPointer “, um eine Replik des Remote-Objekts zu speichern, und instanziieren anschließend ein „ReplicaRequestor“-Objekt:

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

Die vollständige Deklaration und Definition der Requestor-Klasse „ DynamicClient “ lautet wie folgt:

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"

// Konstruktor
DynamicClient::DynamicClient(QSharedPointer<QRemoteObjectDynamicReplica> ptr)
    : QObject(nullptr), clientSwitchState(false), reptr(ptr)
{
    //  Signal „connect“ für „replica valid“ wird bei der Initialisierung des Signal-Slots geändert
    QObject::connect(reptr.data(), &QRemoteObjectDynamicReplica::initialized, this,
                     &DynamicClient::initConnection_slot);
}

// Funktion zur Initialisierung von Verbindungen zwischen Slots und Signalen
void DynamicClient::initConnection_slot()
{
    // Verbinde das Signal „currStateChanged()“ der Quellreplik mit  dem
    // Slot „recSwitchState()“  des Clients,  um den aktuellen Zustand der Quelle zu empfangen:
    QObject::connect(reptr.data(), SIGNAL(currStateChanged(bool)), this,
                     SLOT(recSwitchState_slot(bool)));
   // Verbinde das Signal `echoSwitchState(..)` des Clients mit  dem
    // `server_slot(..)`  der Replik,  um den empfangenen Zustand zurückzusenden:
    QObject::connect(this, SIGNAL(echoSwitchState(bool)), reptr.data(), SLOT(server_slot(bool)));
}

void DynamicClient::recSwitchState_slot(bool value)
{
    // Verwende die Replika-Eigenschaft, um „currState“ von der Quelle abzurufen:
    clientSwitchState = reptr->property("currState").toBool();
    qDebug() << "Received source state " << value << clientSwitchState;
   // Signal senden, um den empfangenen Status an den Server zurückzusenden:
    Q_EMIT echoSwitchState(clientSwitchState);
}

Bei Ausführung zusammen mit dem Beispiel auf der Quellseite entspricht die Ausgabe der in Beispiel 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.