qRegisterMetaType<Block>();
注册类型,并返回id
去掉Q_DECLARE_METATYPE(Block); 导致错误。但是qRegisterMetaType<Block>(“block”);却可以不加。原因如下:
template <typename T>
inline int qRegisterMetaType(
T * dummy = 0
)
{
return qMetaTypeId(dummy);
}
template <typename T>
inline int qMetaTypeId(
#ifndef qdoc
T * /* dummy */ = 0
#endif
)
{
return QMetaTypeId2<T>::qt_metatype_id();
}
-------------------------
template <typename T>
struct QMetaTypeId
{
enum { Defined = 0 };
};
template <typename T>
struct QMetaTypeId2
{
enum { Defined = QMetaTypeId<T>::Defined };
static inline int qt_metatype_id() { return QMetaTypeId<T>::qt_metatype_id(); } 这个没定义!!
};
/opt/QtSDK/Examples/4.7/threads/queuedcustomtype/../../../../Desktop/Qt/474/gcc/include/QtCore/qmetatype.h:169: error: ‘qt_metatype_id’ is not a member of ‘QMetaTypeId<Block>’
Q_DECLARE_METATYPE(Block); 加入使得qt_metatype_id得到定义。
#define Q_DECLARE_METATYPE(TYPE) \
QT_BEGIN_NAMESPACE \
template <> \
struct QMetaTypeId< TYPE > \
{ \
enum { Defined = 1 }; \
static int qt_metatype_id() \
{ \
static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
if (!metatype_id) \
metatype_id = qRegisterMetaType< TYPE >(#TYPE, \
reinterpret_cast< TYPE *>(quintptr(-1))); \
return metatype_id; \
} \
}; \
QT_END_NAMESPACE