【问题标题】:QObject::connect: Cannot queue arguments of type 'int&'QObject::connect: 不能对类型为“int&”的参数进行排队
【发布时间】:2013-06-09 14:54:01
【问题描述】:

我尝试过这样做:

connect(this, SIGNAL(signalClicked(int&)),  classA, SLOT(doWork(int&)));

但我得到了标题中的信息。 所以我探索了互联网,我想出了这个也不起作用的解决方案:

 qRegisterMetaType<int&>("Type");
 connect(this, SIGNAL(signalClicked(Type)),  classA, SLOT(doWork(Type)));

错误:没有匹配函数调用‘qRegisterMetaType(const char[5])’

有什么解决办法吗?

【问题讨论】:

  • #include &lt;QMetaType&gt;吗?
  • 是的,我知道,这就是为什么我不明白...
  • 感谢您的回答,但我已经在qtforum.org/article/36440/… 找到了此解决方案,但不幸的是它仍然无法正常工作。
  • 你的Q_DECLARE_METATYPE呢?
  • 根据 qRegisterMetaType 的 Qt 文档“可以注册具有公共默认构造函数、公共复制构造函数和公共析构函数的任何类或结构。”,这表明它仅适用于类和结构。有人可以在这里纠正我,但我认为您不需要注册类型 int&。

标签: c++ qt qthread


【解决方案1】:

如果 Qt 试图将参数排队,这意味着连接在线程之间。这不适用于非常量引用。

您可以使用 reference_wrapper 来解决此问题,但我强烈建议您重新考虑您的设计。在信号/插槽连接中通过引用传递值不是一个好主意。

【讨论】:

  • 我知道这不是一个好方法,但我是新手,这是我找到的唯一解决方案。实际上我想要实现的是更新主线程中的属性并在无限循环中从另一个线程中读取它。我会尝试你的建议
  • @Dan-Milburn,当 Qt 复制对象时,为什么通过引用传递值不是一个好主意?
  • 如果 Qt 需要一个副本,那么通过(非常量)引用传递的意义何在?无论如何,接收槽将无法修改原件(同时被误导认为它可以)。此外,Qt 信号/插槽背后的要点是,信号发射器不知道连接到它的是什么,或者有多少连接。如果有两个连接的插槽,并且它们都尝试修改通过引用传递的对象,那么您就有各种潜在的错误。在有限的情况下,它可以在非排队连接的情况下工作,但它仍然是糟糕的设计。
  • @Thibel 每次更改该变量的值时,您都可以在 main 中发出一个信号,将值作为参数传递给线程中的插槽。另请注意,在使用排队连接时,您不能将非常量引用作为参数传递给信号和插槽。
  • @DanMilburn,我明白你关于误导性声明的观点。如果希望通过引用传递,使用 QMutex 来防止来自多个侦听器修改数据的问题将防止出现问题。然而,这是学术性的,因为在 QMetaObject::activate 中,如果连接类型是 AutoConnection 并且发送方和接收方在不同的线程中,则值会被复制。见这里:woboq.com/blog/how-qt-signals-slots-work.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
相关资源
最近更新 更多