Qt Remote Objects - Externe QIODevices
Externe QIODevices
Qt Remote Objects unterstützt standardmäßig mehrere Kommunikationskanäle, wie beispielsweise das Paar „ QTcpServer “ und „ QTcpSocket “. Gibt man die gewünschte IP-Adresse „ QUrl “ für TCP oder den gewünschten Namen (für das Paar „ QLocalServer “ und „ QLocalSocket “) an, handelt es sich bei dem für das Abhören und Herstellen der Verbindung erforderlichen Code um Standardcode, der intern von Qt verwaltet wird. „ Qt Remote Objects “ unterstützt auch andere Arten von „ QIODevice “, und die Klassen „ QRemoteObjectNode “ bieten zusätzliche Methoden für Fälle, in denen benutzerdefinierter Code erforderlich ist.
Ein konstruiertes Beispiel mit TCP/IP ist unten dargestellt. Ein realistischeres Beispiel würde eine SSL-Verbindung verwenden, was die Konfiguration von Zertifikaten usw. erfordern würde.
// 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());
});Der Code auf der Replica-Seite muss manuell eine Verbindung zum Host herstellen
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);Externe Schemata
Es ist möglich, jede Seite des „ QIODevice “ zu erstellen und die Funktionen „ QRemoteObjectNode::addClientSideConnection “ (QIODevice *ioDevice) sowie „ QRemoteObjectHostBase::addHostSideConnection “ (QIODevice *ioDevice) wie oben gezeigt aufzurufen. Dies wird vollständig unterstützt, setzt jedoch voraus, dass der Client weiß, wie die Verbindung hergestellt wird, oder über eine Möglichkeit verfügt, diese Informationen zu ermitteln. Genau dieses Problem sollte die Registrierung lösen.
Qt Remote Objects Ermöglicht zudem die Verwendung von „externen Schemata“ mit der Registrierungsstelle, was beim Aufbau der Verbindung hilft. Auf der Seite des „ QRemoteObjectHost “ muss der Benutzer die `hostUrl` mit dem gewünschten Schema festlegen.
// 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.Auf der Replica -Seite muss der „ QRemoteObjectNode “ einen Callback registrieren, der verwendet wird, wenn das externe Schema erkannt wird. Der Callback muss ein „ RemoteObjectSchemaHandler “ sein.
// 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);© 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.