发出带有 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的主要内容,如果未能解决你的问题,请参考以下文章

如何向另一个线程发出带有数组参数的信号

Qt信号和槽的问题

Qt没有发出信号

小部件关闭后 Qt 发出信号

如何向 Qt 中 QThread 类的特定对象发出信号?

Qt:更改QPointer时发出信号