基本使用
QRC使用场景:
- 远程RPC通信,比如服务端提供数据、提供计算能力、相较于HTTP拥有更快的速度,更紧凑的数据格式
- 本机多进程通信(至于稳定的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
其他
异常检测及其处理流程