我希望能够通过网络发送Qt信号.使用Qt的元类型系统序列化信号调用非常简单:
qMetaMethod
使用静态方法创建一个::fromSignal
[1]
使用创建的元方法获取方法名称,参数名称,其typeIds 和值.但到目前为止,我无法弄清楚如何使用序列化数据调用信号:QMetaObject::invokeMethod(..)
将信号/方法名称作为字符串.问题是参数:它们必须被提供为,QGenericArgument
并且只能通过使用Q_ARG
需要实际类型(不是它的名称或字符串typeId
)和相关值的宏来创建.参数的数量也必须在编译时定义,没有invokeMethod(..)
哪个参数列表.
我错过了什么吗?或者有更好/替代方法来做到这一点?
[1]
进一步的问题:如何确保类型在使用时始终获得相同的typeId Q_DECLARE_METATYPE(..)
?
说你无法创造一个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。
归档时间: |
|
查看次数: |
424 次 |
最近记录: |