【发布时间】:2016-07-22 15:59:45
【问题描述】:
我希望能够通过网络发送 Qt 信号。使用 Qt 的元类型系统序列化信号调用非常简单:
- 使用静态方法
::fromSignal创建qMetaMethod - 使用创建的元方法获取方法名称、参数名称、它们的 typeIds
[1]和值。 - 将所有内容打包成您喜欢的格式(JSON、XML)并发送。
但到目前为止,我无法弄清楚如何使用序列化数据调用信号:QMetaObject::invokeMethod(..) 将信号/方法名称作为字符串。问题在于参数:它们必须以QGenericArgument 的形式提供,并且只能使用Q_ARG 宏创建,该宏需要实际类型(不是其名称的字符串或typeId)和相关值。此外,参数的数量必须在编译时定义,没有invokeMethod(..) 接受参数列表。
我错过了什么吗?还是有更好/替代的方法来做到这一点?
[1] 进一步的问题:如何确保类型在使用Q_DECLARE_METATYPE(..) 注册时始终获得相同的 typeId?
【问题讨论】:
-
你没有遗漏任何东西。
-
呃....我不认为信号/槽机制设计用于在整个网络上工作。不过,我很高兴看到自己在这方面被证明是错误的。
-
你是在重新发明 QtRemoteObjects 还是 QtDBus?
-
您使用 QtRemoteObjects,它抽象了传输。
-
这是旧的,但可能是相关的:bugreports.qt.io/browse/QTBUG-28833