gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:27:19 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

旧的:

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_METATYPE 注册类型和 qRegisterMetaType<T>() .有趣!

您可能应该始终使用新语法。它使用成员函数指针并受益于编译时检查

优点:

  • 编译时检查信号和槽的存在,类型,或者缺少 Q_OBJECT。
  • 参数可以由 typedef 或不同的命名空间说明符组成,并且有效。
  • 有可能如果存在隐式转换(例如从 QString 到 QVariant)
  • 可以连接到任何成员QObject 的函数,不仅仅是槽。

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

参见 New Signal Slot Syntax

关于c++ - 为什么 foo(short int *) 和 bar(signed short *) 被 QT 认为是不同的签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29213127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com