Qt Remote Objects - 外部QIODevices

外部QIODevices

Qt Remote Objects は、 と のペアのような、いくつかの通信チャンネルをすぐにサポートします。 (tcp用)、または希望する名前( と のペア用)を指定すると、リッスンと接続に必要なコードは定型文となり、Qtが内部で処理します。 は他のタイプの もサポートし、 クラスはカスタムコードが必要なケースをサポートする追加メソッドを提供します。QTcpServer QTcpSocket QUrl QLocalServer QLocalSocket Qt Remote Objects QIODevice QRemoteObjectNode

TCP/IPを使った例を以下に示します。より現実的な例ではSSL接続を使用し、証明書の設定などが必要になります。

// Create the server and listen outside of QtRO
QTcpServer tcpServer;
tcpServer.listen(QHostAddress(QStringLiteral("127.0.0.1")), 65213);

// Create the host node.  We don't need a hostUrl unless we want to take
// advantage of external schemas (see next example).
QRemoteObjectHost srcNode;

// Make sure any connections are handed to QtRO
QObject::connect(&tcpServer, &QTcpServer::newConnection, &srcNode,
                 [&srcNode, &tcpServer]() {
    srcNode.addHostSideConnection(tcpServer.nextPendingConnection());
});

Replica側のコードは手動でHostに接続する必要があります。

QRemoteObjectNode repNode;
QTcpSocket *socket = new QTcpSocket(&repNode);
QObject::connect(socket, &QTcpSocket::connected, &repNode,
        [socket, &repNode]() {
    repNode.addClientSideConnection(socket);
});
socket->connectToHost(QHostAddress(QStringLiteral("127.0.0.1")), 65213);

外部スキーマ

上記のように、QIODevice の各サイドを作成し、QRemoteObjectNode::addClientSideConnection(QIODevice *ioDevice)とQRemoteObjectHostBase::addHostSideConnection(QIODevice *ioDevice)を呼び出すことが可能です。これは完全にサポートされていますが、クライアントが接続を確立する方法を知っているか、その情報を発見する方法を持っている必要があります。これはまさにレジストリが解決するために設計された問題です。

Qt Remote Objects また、「外部スキーマ」をレジストリで使用することもでき、接続のセットアップに役立ちます。 、ユーザはhostUrlに希望のスキーマを設定する必要があります。QRemoteObjectHost

// Use standard tcp url for the registry
const QUrl registryUrl = QUrl(QStringLiteral("tcp://127.0.0.1:65212"));
// Use "exttcp" for the "external" interface
const QUrl extUrl = QUrl(QStringLiteral("exttcp://127.0.0.1:65213"));

// Create the server and listen outside of QtRO
QTcpServer tcpServer;
tcpServer.listen(QHostAddress(extUrl.host()), extUrl.port());

// We need a registry for everyone to connect to
QRemoteObjectRegistryHost registry(registryUrl);

// Finally, we create our host node and register "exttcp" as our schema.
// We need the AllowExternalRegistration parameter to prevent the node from
// setting a hostUrlInvalid error.
QRemoteObjectHost srcNode(extUrl, registryUrl, QRemoteObjectHost::AllowExternalRegistration);
// From now on, when we call enableRemoting() from this node, the registry
// will be updated to show the Source object at extUrl.

Replica側では、QRemoteObjectNode 、外部スキーマが検出されたときに使用するコールバックを登録する必要があります。コールバックはRemoteObjectSchemaHandler でなければなりません。

// Use standard tcp url for the registry
const QUrl registryUrl = QUrl(QStringLiteral("tcp://127.0.0.1:65212"));

// This time create the node connected to the registry
QRemoteObjectNode repNode(registryUrl);

// Create the RemoteObjectSchemaHandler callback
QRemoteObjectNode::RemoteObjectSchemaHandler setupTcp = [&repNode](QUrl url) {
    QTcpSocket *socket = new QTcpSocket(&repNode);
    connect(socket, &QTcpSocket::connected,
            [socket, &repNode]() {
        repNode.addClientSideConnection(socket);
    });
    connect(socket, &QSslSocket::errorOccurred,
            [socket](QAbstractSocket::SocketError error) {
        delete socket;
    });
    socket->connectToHost(url.host(), url.port());
};

// Once we call registerExternalSchema, the above method will be called
// whenever the registry sees an object we are interested in on "exttcp"
repNode.registerExternalSchema(QStringLiteral("exttcp"), setupTcp);

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