Qt通过网络的信号/插槽机制

Nil*_*ils 5 c++ qt

我希望能够通过网络发送Qt信号.使用Qt的元类型系统序列化信号调用非常简单:

  • qMetaMethod使用静态方法创建一个::fromSignal
  • [1]使用创建的元方法获取方法名称,参数名称,其typeIds 和值.
  • 将所有内容打包为您的首选格式(JSON,XML)并发送.

但到目前为止,我无法弄清楚如何使用序列化数据调用信号:QMetaObject::invokeMethod(..)将信号/方法名称作为字符串.问题是参数:它们必须被提供为,QGenericArgument并且只能通过使用Q_ARG需要实际类型(不是它的名称或字符串typeId)和相关值的宏来创建.参数的数量也必须在编译时定义,没有invokeMethod(..)哪个参数列表.

我错过了什么吗?或者有更好/替代方法来做到这一点?

[1]进一步的问题:如何确保类型在使用时始终获得相同的typeId Q_DECLARE_METATYPE(..)

Rei*_*ica 3

说你无法创造一个QGenericArgument自己是错误的。建议您不要这样做,但无论如何您想要做的事情都非常依赖于实现。没有太多内容:您提供一个类型名称和一个指向给定类型数据的指针。例如:

QGenericArgument one() {
  static const char type[] = "int";
  static const int data = "1";
  return QGenericArgument{type, (void*)&data);
}
Run Code Online (Sandbox Code Playgroud)

有关更多示例代码,请参阅本答案的 Introspectable Visitor 部分。

如何确保类型在使用 注册时始终获得相同的 typeId Q_DECLARE_METATYPE(..)

你不知道。您应该使用类型名称,并且每个进程都应该在本地将这些名称解析为 typeid。

除非您想自己实现,否则请使用现成的东西,例如 MIT 许可的qt-remote-signals