gpt4 book ai didi

qt - 当 Qt-5 连接失败时

转载 作者:行者123 更新时间:2023-12-03 22:21:23 25 4
gpt4 key购买 nike

阅读Qt signal & slots documentation ,看来新式连接失败的唯一原因是:
“如果已经有重复(相同对象上完全相同的插槽的完全相同的信号),则连接将失败并且连接将返回 false”

这意味着第一次连接已经成功,并且在使用 Qt::UniqueConnection 时不允许多连接。

这是否意味着 Qt-5 风格的连接总是会成功?是否有其他原因导致失败?

最佳答案

新款connect由于各种原因,在运行时仍然可能失败:

  • 要么senderreceiver是一个空指针。显然,这需要一个只能在运行时进行的检查。
  • 您为信号指定的 PMF 实际上不是信号。由于缺乏适当的 C++ 反射功能,您在编译时所能做的就是检查信号是否是发送者类的非静态成员函数。

    然而,这还不足以使它成为一个信号:它还需要在 signals: 中。类定义中的部分。当moc看到你的类定义,它会生成 some metadata包含该函数确实是一个信号的信息。因此,在运行时,指针传递给 connect在表中查找,和 connect如果找不到指针,它本身就会失败(因为您没有传递信号)。
  • 对上一点的检查实际上需要对指向成员函数的指针进行比较。这是一个特别棘手的问题,因为它通常会涉及不同的 TU:
  • 一个是包含 moc 生成数据的 TU(通常是 moc_class.cpp 文件)。在这个 TU 中有前面提到的表,其中包含指向信号的指针(它们只是普通的成员函数)。
  • 是您实际调用的 TU connect(sender, &Sender::signal, ...) ,它生成在表中查找的指针。

  • 现在,两个 TU 可能在同一个应用程序中,或者一个在一个库中而另一个在您的应用程序中,或者可能在两个库中,等等;您平台的 ABI开始发挥作用。

    理论上,执行 1. 时存储的指针与执行 2. 时生成的指针相同;在实践中,我们发现了这种情况不会发生的情况(参见我前段时间报告的这个 bug report,ARM 上的旧版本 GNU ld 生成的代码未能通过比较)。

    对于 Qt,这意味着禁用某些优化和/或将一些额外的标志传递到我们知道会发生这种情况并破坏用户软件的地方。例如,从 Qt 5.9 开始,不支持 -Bsymbolic*除了 x86 和 x86-64 之外的任何东西上的 GCC 标志。

    当然,这并不意味着我们已经找到并修复了所有可能的位置。新的编译器和更激进的优化将来可能会再次触发此错误,从而使 connect返回 false,即使一切正常。

    关于qt - 当 Qt-5 连接失败时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43487752/

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