Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to use QtRemoteObjects in order to remote duplicate a model
Forum Update on Monday, May 27th 2025

How to use QtRemoteObjects in order to remote duplicate a model

Scheduled Pinned Locked Moved Unsolved General and Desktop
2 Posts 1 Posters 243 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • I Offline
    I Offline
    IkkiNit
    wrote on 2 Aug 2019, 14:39 last edited by
    #1

    Hello guys,

    I would like to know how to use QtRemoteObjects in order to synchronize a QAbstractItemModel (or QStandardItemModel) from a server into many clients over QTcpSocket (or better QSslSocket).
    The clients can setData on the model and all other clients received the modification with dataChanged. All clients can also call data on the model.

    Is it possible to create a simple sample to do that ?

    Thank you guys !

    1 Reply Last reply
    0
    • I Offline
      I Offline
      IkkiNit
      wrote on 7 Aug 2019, 15:44 last edited by
      #2

      I tried to do my own sample and I have two errors, one client side and the other one server side.

      Here is the server code :

      #include <QtWidgets/QApplication>
      #include <QtNetwork/QTcpServer>
      #include <QtNetwork/QSslSocket>
      #include <QtNetwork/QSslKey>
      #include <QtRemoteObjects/QRemoteObjectHost>
      #include <QtGui/QStandardItemModel>
      #include <QtCore/QFile>
      
      int main(int argc, char *argv[])
      {
      	QApplication app(argc, argv);
      
      	QRemoteObjectHost srcNode;
      	QStandardItemModel model;
      
      	QTcpServer tcpServer;
      	QObject::connect(&tcpServer, &QTcpServer::newConnection, [&srcNode, &tcpServer]()
      	{
      		int descriptor = tcpServer.nextPendingConnection()->socketDescriptor();
      		QSslSocket* socket = new QSslSocket();
      		if (!socket->setSocketDescriptor(descriptor))
      		{
      			delete socket;
      			return;
      		}
      		QFile fileKey(":/Test/server-key.pem");
      		QFile fileCert(":/Test/server-crt.pem");
      		fileKey.open(QIODevice::ReadOnly);
      		fileCert.open(QIODevice::ReadOnly);
      		QSslKey key(&fileKey, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey, "test");
      		QSslCertificate cert(&fileCert);
      		fileKey.close();
      		fileCert.close();
      		socket->setPrivateKey(key);
      		socket->addCaCertificates(QSslCertificate::fromPath(":/ServerLauncher/ca.pem"));
      		socket->setLocalCertificate(cert);
      		socket->setPeerVerifyMode(QSslSocket::VerifyNone);
      		socket->ignoreSslErrors();
      		socket->startServerEncryption();
      		srcNode.addHostSideConnection(socket);
      
      		QObject::connect(socket, &QAbstractSocket::disconnected, socket, &QObject::deleteLater);
      		QObject::connect(socket, QOverload<QAbstractSocket::SocketError>::of(&QSslSocket::error), [socket](QAbstractSocket::SocketError error)
      		{
      			qDebug() << error;
      		});
      	});
      
      	srcNode.enableRemoting(&model, QStringLiteral("TestModel"));
      	
      	tcpServer.listen(QHostAddress::Any, 65213);
      
      	for (int n = 0; n < 500; ++n)
      	{
      		model.appendRow(QList<QStandardItem*>() << new QStandardItem(QString("%1").arg(n)));
      	}
      
      	return app.exec();
      }
      

      Here is the client code :

      #include <QtWidgets/QApplication>
      #include <QtNetwork/QSslSocket>
      #include <QtNetwork/QSslKey>
      #include <QtRemoteObjects/QRemoteObjectNode>
      #include <QtRemoteObjects/QAbstractItemModelReplica>
      #include <QtGui/QStandardItemModel>
      #include <QtCore/QFile>
      #include <QtWidgets/QTreeView>
      
      int main(int argc, char *argv[])
      {
      	QApplication app(argc, argv);
      
      	QTreeView view;
      	view.setWindowTitle(QStringLiteral("RemoteView"));
      	view.resize(640, 480);
      
      	QRemoteObjectNode repNode;
      	repNode.setHeartbeatInterval(1000);
      	QSslSocket socket(&repNode);
      	QObject::connect(&socket, &QSslSocket::connected, [&socket, &repNode, &view]()
      	{
      		socket.startClientEncryption();
      		repNode.addClientSideConnection(&socket);
      
      		QScopedPointer<QAbstractItemModelReplica> model(repNode.acquireModel(QStringLiteral("TestModel")));
      		view.setModel(model.data());
      	});
      	QFile fileKey(":/Test/client-key.pem");
      	QFile fileCert(":/Test/client-crt.pem");
      	fileKey.open(QIODevice::ReadOnly);
      	fileCert.open(QIODevice::ReadOnly);
      	QSslKey key(&fileKey, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey, "test");
      	QSslCertificate cert(&fileCert);
      	fileKey.close();
      	fileCert.close();
      	socket.setPrivateKey(key);
      	socket.addCaCertificates(QSslCertificate::fromPath(":/Test/ca.pem"));
      	socket.setLocalCertificate(cert);
      	socket.setPeerVerifyMode(QSslSocket::VerifyNone);
      	socket.ignoreSslErrors();
      	socket.connectToHostEncrypted("127.0.0.1", 65213);
      
      	view.show();
      
      	return app.exec();
      }
      

      The error I have server side is : "QSocketNotifier: Multiple socket notifiers for same socket 876 and type Read".
      The error I have client side is : "qt.network.ssl: QSslSocket::startClientEncryption: cannot start handshake on non-plain connection".

      The Qt version I am using is 5.12.4.

      Nothing is displayed in the window client side.
      Do you know what are the problems with this code ?

      Thank you guys !

      1 Reply Last reply
      0

      1/2

      2 Aug 2019, 14:39

      • Login

      • Login or register to search.
      1 out of 2
      • First post
        1/2
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved