このページでは

例 1: 静的ソースを使用した直接接続

  1. ソースオブジェクトの作成

    このソースオブジェクトを作成するには、まず定義ファイル `simpleswitch.rep` を作成します。このファイルはオブジェクトのプロパティとメソッドを記述したもので、Qt Remote Objects コンパイラ(repc)への入力となります。このファイルでは、レプリカに対して公開する必要があるインターフェースのみを定義します。

    simpleswitch.rep

    class SimpleSwitch
    {
        PROP(bool currState=false);
        SLOT(server_slot(bool clientState));
    };

    simpleswitch.rep では、

    • currState には、スイッチの現在の状態が格納されています。
    • server_slot() これにより、ソースとのやり取りが可能になります。これはechoSwitchState(bool newstate) 信号に接続されます。

    repcがこのファイルを処理できるようにするには、cmake ファイルに次の行を追加してください:

    qt6_add_repc_sources(directconnectserver
        simpleswitch.rep
    )

    qmake を使用している場合は:

    REPC_SOURCE = simpleswitch.rep

    この手順は Qt Remote Objects モジュールにのみ適用されるため、プロジェクトにこのモジュールも追加する必要があります。CMake を使用している場合は、以下を追加してください:

    find_package(Qt6 REQUIRED COMPONENTS RemoteObjects)
    target_link_libraries(directconnectserver PRIVATE Qt6::RemoteObjects)

    qmake を使用している場合は、次のように追加してください:

    QT       += remoteobjects

    repc は、指定したビルドディレクトリにrep_SimpleSwitch_source.h ヘッダーを作成します。詳細については、「ソース」を参照してください。

    repc は、QtRO で使用する 3 つのヘルパークラスを作成します。この例では、基本となる `SimpleSwitchSimpleSource` を使用します。これは `rep_SimpleSwitch_source.h` で定義されている抽象クラスです。以下に示すように、このクラスを基にして `SimpleSwitch` の実装クラスを定義します。

    simpleswitch.h

    #ifndef SIMPLESWITCH_H
    #define SIMPLESWITCH_H
    
    #include "rep_simpleswitch_source.h"
    
    class SimpleSwitch : public SimpleSwitchSimpleSource
    {
        Q_OBJECT
    public:
        SimpleSwitch(QObject *parent = nullptr);
        ~SimpleSwitch();
        void server_slot(bool clientState) override;
    public Q_SLOTS:
        void timeout_slot();
    private:
        QTimer *stateChangeTimer;
    };
    
    #endif

    simpleswitch.h では、

    • stateChangeTimer は、SimpleSwitchの状態を切り替えるために使用されるQTimer です。
    • timeout_slot() は、stateChangeTimer のtimeout()シグナルに接続されています。
    • server_slot() – これは、いずれかのレプリカが自身のスロットを呼び出すたびにソース側で自動的に呼び出され – 受信した値を出力します。
    • currStateChanged(bool)repcによって生成された rep_SimpleSwitch_source.h で定義されているこのシグナルは、currState が状態を切り替えるたびに発火します。この例では、ソース側でこのシグナルを無視し、後でレプリカ側で処理します。

    SimpleSwitch クラスの定義は以下の通りです:

    simpleswitch.cpp

    #include "simpleswitch.h"
    
    // コンストラクタ
    SimpleSwitch::SimpleSwitch(QObject*parent) : SimpleSwitchSimpleSource(parent)
    {
        stateChangeTimer= newQTimer(this);// タイマーを初期化
        QObject::connect(stateChangeTimer, &QTimer::timeout, this, &SimpleSwitch::timeout_slot);// stateChangeTimerのtimeout()シグナルをsimpleSwitchのtimeout_slot()に接続
        stateChangeTimer->start(2000);// タイマーを開始し、タイムアウトを2秒に設定
        qDebug() << "Source Node Started";
    }
    
    // デストラクタ
    SimpleSwitch::~SimpleSwitch()
    {
        stateChangeTimer->stop();
    }
    
    voidSimpleSwitch::server_slot(boolclientState)
    {
        qDebug() << "Replica state is " << clientState; // print switch state echoed back by client
    }
    
    voidSimpleSwitch::timeout_slot()
    {
        // タイマーのタイムアウト時に呼び出されるスロット
        if(currState())// 現在の状態がtrueかどうかを確認。currState()は、repcによって生成されたrep_simpleswitch_source.hに定義されている
            setCurrState(false);// 状態をfalseに設定
        else
            setCurrState(true);// 状態をtrueに設定
        qDebug() << "Source State is "<<currState();
    
    }
  2. レジストリの作成 この例ではノード間の直接接続を使用しているため、この手順は省略できます。

  3. ホストノード

    の作成

    ホストノードは以下のように作成されます:

    QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:replica")));
  4. ホストの Source オブジェクトと

    リモート通信 以下のステートメントは、Sourceオブジェクトをインスタンス化し、それをホストに渡して「リモート通信」を有効にします。これは、オブジェクトを QtRO ネットワーク上で可視化するプロセスです:

    SimpleSwitch srcSwitch; // create simple switch
    srcNode.enableRemoting(&srcSwitch); // enable remoting

    上記の手順を実装したmain.cpp ファイルの内容は以下の通りです:

    main.cpp

    #include <QCoreApplication>
    #include "simpleswitch.h"
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        SimpleSwitch srcSwitch; // create simple switch
    
        // Create host node without Registry:
        QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:replica")));
        srcNode.enableRemoting(&srcSwitch); // enable remoting/sharing
    
        return a.exec();
    }

    このソースサイドプロジェクトをコンパイルして実行します。レプリカが作成されていない状態での出力は、以下の通り、スイッチの状態が2秒ごとにtrue とfalse の間で切り替わっているはずです。

    例 1:サーバーの出力

  • 次の手順では、ネットワークのレプリカ側を作成します。この例では、レプリカ側はソースからスイッチの状態を取得し、それをエコーバックします。

    レプリカのコード

    1. repc

      を使用してプロジェクトに

      レプリカを追加します

      。ソース側で使用したものと同じ API 定義ファイル(SimpleSwitch.rep )を使用し、repc を使ってレプリカヘッダーファイルを作成します。cmake を使用している場合は、クライアント側のcmake ファイルに以下の行を追加し、.rep ファイルを入力として指定してください:

      qt6_add_repc_replicas(directconnectclient
          simpleswitch.rep
      )

      qmake を使用している場合は、クライアント側の.pro ファイルに次の行を追加してください:

      REPC_REPLICA = simpleswitch.rep

      repcツールは、ビルドディレクトリにrep_SimpleSwitch_replica.h ファイルを生成します。詳細については、「Replica」を参照してください。

    2. ソースの

      ホストノード

      に接続するためのノードを作成する

      。以下のコードは、ネットワーク上の 2 番目のノードをインスタンス化し、それをソースのホストノードに接続します。

      QRemoteObjectNode repNode; // create remote object node
      repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node
    3. ノードのacquire() を呼び出して、レプリカへのポインタを作成します

      まず、レプリカをインスタンス化します:

      QSharedPointer<SimpleSwitchReplica> ptr;
      ptr.reset(repNode.acquire<SimpleSwitchReplica>()); // acquire replica of source from host node

      注: acquire()はレプリカへのポインタを返しますが、そのライフサイクルは管理しません。この例では、返されたポインタをQSharedPointer またはQScopedPointer でラップし、ポインタが常に適切に削除されるようにするという推奨される手順を示しています。

      main.cpp では、上記の手順を実装し、オブジェクトをインスタンス化します:

      main.cpp

      #include <QCoreApplication>
      #include "client.h"
      
      int main(int argc, char *argv[])
      {
          QCoreApplication a(argc, argv);
      
          QSharedPointer<SimpleSwitchReplica> ptr; // shared pointer to hold source replica
      
          QRemoteObjectNode repNode; // create remote object node
          repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node
      
          ptr.reset(repNode.acquire<SimpleSwitchReplica>()); // acquire replica of source from host node
      
          Client rswitch(ptr); // create client switch object and pass reference of replica to it
      
          return a.exec();
      }

      Client クラスの完全な宣言と定義は以下の通りです:

      client.h

      #ifndef _CLIENT_H
      #define _CLIENT_H
      
      #include <QObject>
      #include <QSharedPointer>
      
      #include "rep_simpleswitch_replica.h"
      
      class Client : public QObject
      {
          Q_OBJECT
      public:
          Client(QSharedPointer<SimpleSwitchReplica> ptr);
          ~Client() override = default;
          void initConnections();// Function to connect signals and slots of source and client
      
      Q_SIGNALS:
          void echoSwitchState(bool switchState);// this signal is connected with server_slot(..) on the source object and echoes back switch state received from source
      
      public Q_SLOTS:
          void recSwitchState_slot(bool); // slot to receive source state
      private:
          bool clientSwitchState; // holds received server switch state
          QSharedPointer<SimpleSwitchReplica> reptr;// holds reference to replica
      
       };
      
      #endif

      client.cpp

      #include "client.h"
      
      // コンストラクタ
      Client::Client(QSharedPointer<SimpleSwitchReplica>ptr) :
          QObject(nullptr),reptr(ptr)
      {
          // 初期化スロットで初期化されたレプリカのシグナルを接続する。
          initConnections();
          //  このレプリカは repc によって生成されたものであるため、
          //  SimpleSwitchReplica のシグナルやスロットに 直接 接続できる 。
      }
      
      voidClient::initConnections()
      {
          // シグナルとスロット間の接続を初期化する
      
          // ソースレプリカのシグナル currStateChanged() をクライアントの recSwitchState() スロットに接続し、ソースの現在の状態を受信する
          QObject::connect(reptr.data(), &SimpleSwitchReplica::currStateChanged, this, &Client::recSwitchState_slot);
          // クライアントの echoSwitchState(..) シグナルをレプリカの server_slot(..) に接続し、受信した状態をエコーバックする
          QObject::connect(this, &Client::echoSwitchState,reptr.data(), &SimpleSwitchReplica::server_slot);
      }
      
      voidClient::recSwitchState_slot(boolvalue)
      {
          qDebug() << "Received source state "<< value << reptr.data()->currState();
          clientSwitchState=reptr.data()->currState();
          Q_EMIT echoSwitchState(clientSwitchState);// 受信した状態をサーバーにエコーバックする信号を送信する
      }

      このサンプルをソース側のサンプルと一緒にコンパイルして実行すると、次のような出力が得られます。

      Direct Connect サーバーとクライアント間の通信出力

    © 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.