为什么foo(short int *)和bar(签名short *)被QT​​认为是不同的签名?

时间:2015-03-23 14:41:26

标签: c++ qt

QObject::connect: Incompatible sender/receiver arguments
    Bar::bar(signed short*) --> Foo::foo(short int*)

有没有办法让QT在这类事情上更聪明,还是我应该使用编码标准来避免这种奇怪的事情?

编辑:上述错误消息是来自失败的connect()调用的运行时错误消息。

2 个答案:

答案 0 :(得分:5)

有两种语法可以建立信号和插槽连接:

旧:

connect(sender, SIGNAL(valueChanged(int)), receiver, SLOT(updateValue(int)));

新:

connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue);

旧语法使用SIGNALSLOT宏。说到这种语法,Qt的元编译器很笨 - 它依赖于字符串解析。如果字符串不匹配,则不连接。在我的系统上(具有32位int),我无法将someFunc(int)连接到anotherFunc(int32_t)。更糟糕的是,如果没有使用someFunc(int32_t)anotherFunc(int32_t)注册该类型,我就无法将Q_DECLARE_METATYPEqRegisterMetaType<T>()相关联。有趣!

您应该始终使用新语法。它使用成员函数指针和编译时检查的好处

优点:

  • 编译时间检查信号和插槽的存在 类型,或者如果缺少Q_OBJECT。
  • 参数可以是typedef或不同的命名空间说明符,它可以工作。
  • 可能性 如果存在隐式转换,则自动转换类型(例如 从QString到QVariant)
  • 可以连接任何会员 QObject的功能,不仅仅是插槽。

我相信新语法可以解决您的问题。

请参阅New Signal Slot Syntax

答案 1 :(得分:3)

如果你想要,你可以通过报告这个MOC类型检查中的错误来使一些Qt开发人员痛苦,他们用来检查信号/插槽参数匹配。

但更严重的是:不要这样做!始终命名相同的类型。只需使用short *

其他任何事情对其他孩子都不好。