1 概述
Qt Remote Object简称QtRO,这是Qt5.9以后官方推出来的新模块,专门用于进程间通信(IPC)。QtRO本质上是一个点对点的通信网络。每个进程通过QRemoteObjectNode接入QtRO网络。功能提供节点(可以理解为服务器)需要使用QRemoteObjectHost将一个提供实际功能的QObject派生类注册进QtRO网络中,然后其他使用该功能的程序则通过各自的QRemoteObjectNode连接到该Host上,然后acquire一个该功能对象的Replica。等到该Replica初始化好后,该程序就能够使用Replica中的信号、槽以及属性,就好像功能类就在本地一样。QTRO分为两种Replica,一种时动态的Replica,一种是静态的Replica。
2静态和动态的对比
静态Replica:
优势
拥有明确的定义,更适合在C++中使用(因为有repc生成的头文件)。
支持POD等复杂结构的定义。
更高效。因为结构定义都已经在C++中定义好了,不需要动态传输、构建,节省了开销。
劣势
Source端和Replica端必须严格使用同一版本的rep文件,即使rep文件内只是添加了一行注释,否则会连接不上。
动态Replica
优势
由于Client端不需要rep文件,所以Server端可以随时修改,这就避免了静态模式下的缺点。
劣势
不支持POD等复杂结构定义。
必须等初始化后才能使用,给编程增加了额外复杂度,同时增加了构建连接的额外开销。这个是动态这个特性决定的。
pod类型简单的理解就是float、int、string、class、struct等类型。
3 静态Replica
服务端
1创建rep文件
rep文件是一种DSL(Domain Specific Language),专门用于定义QtRO接口。在编译的时候,该文件会首先经过repc.exe这个程序处理,生成对应的头文件和源文件。
commoninterface.rep
class CommonInterface
{
SIGNAL(sigMessage(QString msg)) //server下发消息给client
SLOT(void onMessage(QString msg)) //server接收client的消息
}
2编译
添加QtRO模块
QT += remoteobjects
添加rep文件
REPC_SOURCE += \
./Reps/CommonInterface.rep
编译,然后在程序的输出目录可以找到生成的rep头文件

3实现功能类
创建一个类,继承于自动生成的这个类,并实现其中所有的虚函数。
CommonInterface.h
#ifndef COMMONINTERFACE_H
#define COMMONINTERFACE_H
#include "rep_CommonInterface_source.h"
class CommonInterface:public CommonInterfaceSource
{
Q_OBJECT
public:
explicit CommonInterface(QObject * parent = nullptr);
//接收消息
void onMessage(QString msg) override;
//发送消息
void sendMsg(QString msg);
signals:
void sigReceiveMsg(QString);
};
#endif // COMMONINTERFACE_H
CommonInterface.cpp
#include "CommonInterface.h"
CommonInterface::CommonInterface(QObject *parent):
CommonInterfaceSource(parent)
{
}
void CommonInterface::onMessage(QString msg)
{
emit sigReceiveMsg(msg);
}
void CommonInterface::sendMsg(QString msg)
{
sigMessage(msg);
}
4实现Server的主逻辑
Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "CommonInterface.h"
#include <QRemoteObjectHost>
#include <QDateTime>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
void init();
private slots:
void onReceiveMsg(QString msg);
void sendBtnClicked();
void lineRetrunPressed();
private:
Ui::Widget *ui;
CommonInterface* m_pInterface=nullptr;
QRemoteObjectHost* m_pHost=nullptr;
};
#endif // WIDGET_H
Widget.cpp
#include "Widget.h"
#include "ui_Widget.h"
Widget::Widget(QWidget *



被折叠的 条评论
为什么被折叠?



