小虎技术分享站 - QtRo
type: channel
link: https://www.xtigerkin.com/tag/QtRo/
items: Qt Remote Objects实现进程间调用

Qt Remote Objects实现进程间调用
type: item
date: 2023-11-21T15:25:00+08:00
description: The Qt Remote Objects module provides an easy way to share Qt APIs between processes and devices. For this to work, we require a data channel between processes and devices.根据Qt 5.15.2 官方手册介绍, Qt Remote Objects提供了一种简单的在进程间或者设备间共享Qt API的方式，类似于gRPC的远程过程调用。但个人感觉比gRPC简单许多。本文将介绍QtRO的简单使用。完整项目代码：Github创建项目接口首先创建如下的项目结构，需要一个服务端，我们这里为了方便选用控制台来演示，一个支持GUI操作的客户端来触发远程接口调用。定义接口为了能够实现两个进程间的远程过程调用，我们需要定义他们之间的通信标准。QtRO定义了一种声明通信接口的语法规则，来声明API接口模型，并通过特定的代码生成器生成客户端和服务端的接口。我们定义一个最简单的接口 SimpleRO.repclass SimpleROInterface { SIGNAL(message(QString msg)) // send message to client SLOT(void onMessage(QString msg)) // receive message from client }将定义的接口文件添加到客户端和服务端项目中在客户端的QMake配置文件中加入如下的配置REPC_REPLICA += \ ../common/SimpleRO.rep在服务端的QMake配置文件中加入如下的配置REPC_SOURCE += \ ../common/SimpleRO.rep注意：客户端和服务端是不一样的，用于告诉QMake生成不同的客户端和服务端代码实现服务端功能类新增一个SimpleROInterface 类实现接口中定义的功能#ifndef SIMPLEROINTERFACE_H #define SIMPLEROINTERFACE_H #include <QObject> #include "rep_SimpleRO_source.h" class SimpleROInterface : public SimpleROInterfaceSource { Q_OBJECT public: explicit SimpleROInterface(QObject *parent = nullptr); void sendMessage(const QString& message); public Q_SLOTS: virtual void onMessage(const QString& message) override; }; #endif // SIMPLEROINTERFACE_H#include "SimpleROInterface.h" #include <QDebug> SimpleROInterface::SimpleROInterface(QObject *parent) : SimpleROInterfaceSource{parent} { } void SimpleROInterface::sendMessage(const QString &_message) { Q_EMIT message(_message); } void SimpleROInterface::onMessage(const QString &message) { qDebug() << "Client -> Server Message:" << message; QString flipMessage = message; std::reverse(flipMessage.begin(), flipMessage.end()); sendMessage(flipMessage); }在main.cpp 中增加QRemoteObjectHost 的监听#include <QCoreApplication> #include <QRemoteObjectHost> #include "SimpleROInterface.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); auto host = new QRemoteObjectHost(&a); host->setHostUrl(QUrl("local:interfaces")); auto interface = new SimpleROInte…