通过引用信号和槽来传递抽象类参数

时间:2016-02-25 10:07:23

标签: c++ qt qt-signals

我想通过引用它们的基类来传递我的对象:
connect(pCaller, SIGNAL(sig2(const IBase &)), pReceiver, SLOT(slot2(const IBase &)));

但我得到运行时错误:

  

QObject :: connect:无法对类型' IBase'的参数进行排队。   (确保' IBase'使用qRegisterMetaType()注册。)

因此我补充说:
qRegisterMetaType<IBase>("IBase");

并获得编译时错误:

  

错误C2259:&#39; IBase&#39;:无法实例化抽象类

解决此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

  1. 您的班级IBase必须是可复制和可构造的,如果您想直接传递它(而不是通过指针)
  2. 您需要在标头中注册IBase * Q_DECLARE_METATYPE宏(仅在全局命名空间中) - Q_DECLARE_METATYPE( IBase * )。指针是POD类型,因此它们是可复制/可构造的。
  3. 如果您想在不同的主题之间传递IBase *,则需要使用qRegisterMetaType<IBase *>()调用注册课程;
  4. 通过指针传递指针是不好的做法,因为很难控制传递对象的生命周期。
  5. 好的解决方法:您可以使用Q_DECLARE_METATYPE( IBase * )宏注册您的类型,并使用QVariant包裹您的变量:QVariant wrapper; wrapper.setValue( p ); p = wrapper.value<IBase *>();

答案 1 :(得分:0)

您收到此错误是因为调用方和接收方位于不同的线程中。跨线程槽调用需要能够复制所有参数。由于您通过引用传递基本类型,因此通常无法复制它:(