发出带有 qt 信号的 std::string
Posted
技术标签:
【中文标题】发出带有 qt 信号的 std::string【英文标题】:emit std::string with qt signal 【发布时间】:2011-10-08 18:43:01 【问题描述】:我正在尝试使用 qt 信号发出标准字符串。信号将按队列传递。我用 qRegisterMetaType 注册了类型,就像它在 qt 文档中所说的那样,但没有运气。我是这样注册的
qRegisterMetaType<std::string>("std::string")
【问题讨论】:
【参考方案1】:你也应该这样做:
Q_DECLARE_METATYPE (std::string)
引用Qt Doc
添加 Q_DECLARE_METATYPE() 使所有模板都知道该类型 基于函数,包括 QVariant。请注意,如果您打算使用 排队信号和槽连接中的类型 或 QObject 的 属性系统,您还必须调用 qRegisterMetaType(),因为 名称在运行时解析。
【讨论】:
我试过了,还是不行。此外,我的项目中有许多发出非 qt 类型的信号,并且从未对它们进行过 Q_DECLARE_METATYPE,只有 qRegisterMetaType,它们正在工作。 我刚刚做了一个快速测试,同时使用 qRegisterMetaType 和 Q_DECLARE_METATYPE 确实有效。遗漏任何一个都会导致运行时错误消息有关需要调用 qRegisterMetaType。我的猜测是,对于您使用的其他类型,您没有使用排队连接。 好的,我正在使用这个重载 void qRegisterMetaTypeStreamOperators ( const char * typeName ) 也许这就是它不起作用的原因。当尝试这个重载 int qRegisterMetaType () 与 Q_DECLARE_METATYPE 的组合时,它可以工作,所以谢谢非常喜欢。 我仍然想知道,为什么我的项目中的其他连接(我确信已排队)仅与 qRegisterMetaTypeStreamOperators ( const char * typeName ) 一起使用,并且不需要 Q_DECLARE_METATYPE 宏。这带来了一个问题,当使用排队信号时,使用哪个版本的 qRegisterMetaType? 我担心您第一次发表评论时它不起作用,所以我现在松了一口气。很高兴它有效。有时 Qt 元类型系统就像魔术一样工作。我认为最好在 Freenode 的#qt 频道上询问内在函数。以上是关于发出带有 qt 信号的 std::string的主要内容,如果未能解决你的问题,请参考以下文章