例 1: 静的ソースを使用した直接接続
- ソースオブジェクトの作成
このソースオブジェクトを作成するには、まず定義ファイル `
simpleswitch.rep` を作成します。このファイルはオブジェクトのプロパティとメソッドを記述したもので、Qt Remote Objects コンパイラ(repc)への入力となります。このファイルでは、レプリカに対して公開する必要があるインターフェースのみを定義します。simpleswitch.repclass 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 += remoteobjectsrepc は、指定したビルドディレクトリに
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; }; #endifsimpleswitch.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(); } レジストリの作成 この例ではノード間の直接接続を使用しているため、この手順は省略できます。
ホストノード
の作成ホストノードは以下のように作成されます:
QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:replica")));- ホストの 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の間で切り替わっているはずです。
次の手順では、ネットワークのレプリカ側を作成します。この例では、レプリカ側はソースからスイッチの状態を取得し、それをエコーバックします。
レプリカのコード
- repc
を使用してプロジェクトに
レプリカを追加します。ソース側で使用したものと同じ API 定義ファイル(
SimpleSwitch.rep)を使用し、repc を使ってレプリカヘッダーファイルを作成します。cmakeを使用している場合は、クライアント側のcmakeファイルに以下の行を追加し、.repファイルを入力として指定してください:qt6_add_repc_replicas(directconnectclient simpleswitch.rep )qmakeを使用している場合は、クライアント側の.proファイルに次の行を追加してください:REPC_REPLICA = simpleswitch.reprepcツールは、ビルドディレクトリに
rep_SimpleSwitch_replica.hファイルを生成します。詳細については、「Replica」を参照してください。 - ソースの
ホストノード
に接続するためのノードを作成する。以下のコードは、ネットワーク上の 2 番目のノードをインスタンス化し、それをソースのホストノードに接続します。
QRemoteObjectNode repNode; // create remote object node repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node - ノードの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 }; #endifclient.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);// 受信した状態をサーバーにエコーバックする信号を送信する }このサンプルをソース側のサンプルと一緒にコンパイルして実行すると、次のような出力が得られます。

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