基本使用

QRC使用场景:

  1. 远程RPC通信,比如服务端提供数据、提供计算能力、相较于HTTP拥有更快的速度,更紧凑的数据格式
  2. 本机多进程通信(至于稳定的rpc通信还有一部分工作要做)

Qt Remote Connect遵循常见的RPC写法,首先有几个概念

1 rep文件介绍

rep文件是描述rpc的一个公共函数,rep文件首先由qt工具生成一个类似rep_XXX_source.h的文件,内部有如下类:

XXXSource:这里是个虚接口类,如果rep仅有信号,那么这个可以直接使用,如果有变量一类,比如可读,那么仅有可读的虚函数接口,需要使用者自行实现
XXXSimpleSource:这是个简单的实现类,和XXXSource差异表现在如果PROP包裹的变量会对应生成实现,是一个完整可用的类。

rep文件组织

  • 直接使用型:直接使用XXXSimpleSource或XXXSource(如果没有声明属性的话)
  • 工程化型(从命名,继承,属性权限):一般是继承XXXSource类,写对应的逻辑

对变量的描述有读写控制,如果是只读的,那么

  • PROP:声明一个属性(属性解释为:值和读写函数)及其对应的读写权限,这个会有读、写(如果允许的花)、和一个change信号(连接此change信号来获取值的更新状态)
  • SIGNAL:信号,A发送这个信号,B connect这个信号,那么就构成了信号槽的通信行为
  • SLOT:A将信号连接到此slot,那么其他端实现此SLOT时,当A发送信号,其余链接端都将收到A的信号传递值,可用来做状态同步或信息广播

2 使用

使用时,首先区分各个端提供的服务和需要的服务,涉及到的几个类:QRemoteObjectHost,QRemoteObjectNode,QRemoteObjectDynamicReplica(仅动态连接需要),RPC类
服务端

m_rpc = new MyRPCSimpleSource(this);

// host
m_host = new QRemoteObjectHost(this);
m_host->setHostUrl(QUrl("local:myrpc"));

m_host->enableRemoting(m_rpc);

/* 连接感兴趣的信号 */
connect(m_rpc,&MyRPCSource::msgFromA,this,&Widget::onMessageA);
connect(m_rpc,&MyRPCSource::msgFromB,this,&Widget::onMessageB);

客户端直连

/* 客户端点 */
    m_node = new QRemoteObjectNode(this);
    m_node->connectToNode(QUrl("local:myrpc"));

    m_rpc = m_node->acquire<MyRPCReplica>();
    /* 连接感兴趣的值 */
    connect(m_rpc,&MyRPCReplica::msgFromServer,this,&Widget::onMessageFromServer);

客户端动态连接

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    m_node = new QRemoteObjectNode(this);
    m_node->connectToNode(QUrl("local:myrpc"));

    m_rpc = m_node->acquireDynamic("MyRPC");

    connect(m_rpc,&QRemoteObjectDynamicReplica::initialized,this,&Widget::connectedRPC);
    connect(m_rpc,&QRemoteObjectDynamicReplica::stateChanged,[](QRemoteObjectReplica::State state, QRemoteObjectReplica::State oldState) {
        qDebug() << "state change" << state << oldState;
    });
}

void Widget::connectedRPC()
{
    qDebug() << "dynamic connected";
    connect(m_rpc,SIGNAL(msgFromServer(QString)),this,SLOT(onMessageFromServer(QString)));
}

直接使用和dynamic使用的区别

  • 直连使用,在pro文件需要rep文件,而dynamic不需要
  • 动态连接方式需要initialized信号,这个信号在server创建后,才触发,可在对应的槽实现和rpc的信号槽链接

Demo

git链接

其他

异常检测及其处理流程