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

use*_*438 1 c++ qt

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

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

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

Ele*_*rks 5

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

旧:

connect(sender, SIGNAL(valueChanged(int)), receiver, SLOT(updateValue(int)));
Run Code Online (Sandbox Code Playgroud)

新:

connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue);
Run Code Online (Sandbox Code Playgroud)

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

您可能应该始终使用新语法.它使用成员函数指针并从编译时检查中获益

优点:

  • 编译时间检查信号和槽的存在,类型,或Q_OBJECT是否丢失.
  • 参数可以是typedef或不同的命名空间说明符,它可以工作.
  • 如果存在隐式转换(例如从QString到QVariant),可以自动转换类型
  • 可以连接到QObject的任何成员函数,而不仅仅是插槽.

我相信新语法应该可以解决您的问题.

请参阅新信号槽语法