为什么Qt信号的参数不能用typedef类型定义?

水国馆

对于Qt5 / c ++ 11项目,我正在使用带有其positionChanged()信号的QMediaPlayer对象(名为audio_player):

这段代码可以:

connect(this->audio_player,
        SIGNAL(positionChanged(qint64)),
        this,
        SLOT(audio_position_changed(qint64)));

但这不起作用:

typedef PosInAudio qint64;

connect(this->audio_player,
        SIGNAL(positionChanged(PosInAudio)),
        this,
        SLOT(audio_position_changed(PosInAudio)));

在运行时,我收到消息“ QObject :: connect:没有这样的信号QMediaPlayer :: positionChanged(PosInAudio)”

我很困惑地看到,即使使用#define定义的类型也不行:

#define PosInAudio qint64

connect(this->audio_player,
        SIGNAL(positionChanged(PosInAudio)),
        this,
        SLOT(audio_position_changed(PosInAudio)));

(与上面相同的错误消息)

这是预期的行为吗?还是我犯错了?


如上所述(感谢您使用Matteo Italia),如果您使用此处所述的Qt5新信号槽语法,一切都会好的

Matteo意大利

问题源于以下事实:旧样式connect实际上可以比较字符串以匹配信号和插槽,并且在这里,信号声明(void positionChanged(qint64))中使用的签名connect调用(void positionChanged(PosInAudio))中使用的签名不匹配。只是比较字符串。

SIGNALSLOT基本上字符串化宏(旧式的实际签名connect涉及const char *或等效的东西); connect对接收的字符串执行规范化(删除不必要的空格,const引用和co。-参见QMetaObject::normalizedSignature-但又一次,不了解typedefs或名称空间),并尝试将它们与元对象中找到的信号/插槽列表进行匹配。

反过来,该列表是由MOC生成的,MOC对C ++语法和语义有相当模糊的理解,并且非常残酷地提取信号和插槽签名。因此,MOC产生的字符串以及放入SIGNALSLOT宏中的内容都不知道诸如typedefs或“等效”名称之微妙之处(例如,当前名称空间的局部类型,当在外部引用时,名称必须以名称空间),因此connect如果您在信号和插槽中使用了“复杂的”(非文字匹配)类型名称,则会失败。

新样式(Qt5 +)connect(在@peppe的注释中提到)应该可以解决这些问题(并允许将信号连接到lambda等整洁的东西),但是如果您必须使用旧样式connects来避免出现问题,则应该始终以相同的方式引用类型-例如,如果typedef在信号声明中使用a ,则也必须在插槽中使用它;如果信号中有命名空间类型,请在它们前面加上足够的命名空间,并在插槽中进行相同的操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我不能用typedef完成类型?

为什么ReadOnlySpan不能用作泛型委托和泛型方法的类型参数?

为什么不能用联合类型参数调用泛型函数?

错误:名称“ E”不是类型,因此不能用作类型参数,为什么以及如何创建泛型函数?

为什么R不能用给定值替换函数参数?

为什么在启动 Blender 时不能用 QProcess 传递参数?

为什么“ kotlin.Result”不能用作返回类型?

为什么不能用索引类型推断写入对象属性

为什么我的Wordpress简码功能不能用于我的自定义帖子类型?

为什么不能推断委托参数的类型?

为什么不能使用此构造函数参数构造此用户定义类型的对象?

为什么我不能在MMT中使用类型参数定义(使用PLF)?

为什么我在TypeScript中遇到“类型'String'不能用作索引类型”错误

为什么我不能用链表::新?

为什么OptionT不能用于Try?

为什么不能用if完成呢?

为什么不能用xidel提取数据?

ngInfiniteScroll为什么不能用于表格?

为什么 X 不能用作函数?

为什么 basename 不能用于变量?

为什么我不能用方法添加?

为什么我不能用pygame射击?

为什么我不能用我的 URL 参数设置选择选项的值?

为什么我不能用实现类作为参数的重载方法

为什么_不能用于表示方法重写中未使用/忽略的参数?

为什么泛型不能用代码编写的动作需要显式的参数声明

为什么`boost :: multi_index replace`不能用于指针类型?

为什么int64类型不能用rolling?

为什么`Array<Value>, Value` 不能用于获取数组值类型?