遍历继承QObject的对象的属性
目前在用QtRemoteObjects来进行前后端的通讯,有很多的遍历(信号、槽、同步/异步调用等),也有一些不足(无法识别槽函数是被哪个客户端调用),但基本还算可以用。
QtRO客户端QRemoteObjectNode/QRemoteObjectReplica
已经自带断线重连功能。在使用的过程中,我们将属性改变的信号连接到了特定的槽函数中,而这些槽函数中所做的一些处理,希望在重连后重新执行一遍。
而经过测试,在自动重连后,QRemoteObjectReplica的POD类型的属性会重新出Changed信号,而其他复杂类型不会,因此需要手动重新发出所有属性的改变信号,触发一下函数。
可以在与QRemoteObjectReplica::stateChanged相连接的槽函数中,这样处理:
// 在 stateChanged 的槽函数中if(state == QRemoteObjectReplica::Valid) {const QMetaObject* meta = replica->metaObject();// 注意要使用propertyOffset()for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) {QMetaProperty prop = meta->property(i);if (prop.hasNotifySignal()) {QMetaMethod signalMethod = prop.notifySignal();// 将属性数据读取出来,然后手动发射信号,从而触发槽函数// 所有属性的notify都只有一个参数signalMethod.invoke(replica, Q_ARG(QVariant, prop.read(replica)));}}}