我想通过引用它们的基类来传递我的对象:
connect(pCaller, SIGNAL(sig2(const IBase &)), pReceiver, SLOT(slot2(const IBase &)));
但我得到运行时错误:
QObject :: connect:无法对类型' IBase'的参数进行排队。 (确保' IBase'使用qRegisterMetaType()注册。)
因此我补充说:
qRegisterMetaType<IBase>("IBase");
并获得编译时错误:
错误C2259:&#39; IBase&#39;:无法实例化抽象类
解决此问题的最佳方法是什么?
答案 0 :(得分:3)
IBase
必须是可复制和可构造的,如果您想直接传递它(而不是通过指针)IBase *
Q_DECLARE_METATYPE
宏(仅在全局命名空间中) - Q_DECLARE_METATYPE( IBase * )
。指针是POD类型,因此它们是可复制/可构造的。IBase *
,则需要使用qRegisterMetaType<IBase *>()
调用注册课程; Q_DECLARE_METATYPE( IBase * )
宏注册您的类型,并使用QVariant
包裹您的变量:QVariant wrapper; wrapper.setValue( p ); p = wrapper.value<IBase *>();
。答案 1 :(得分:0)
您收到此错误是因为调用方和接收方位于不同的线程中。跨线程槽调用需要能够复制所有参数。由于您通过引用传递基本类型,因此通常无法复制它:(