qRegisterMetaType

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

posted on 2011-11-17 14:48  katago  阅读(7906)  评论(0编辑  收藏  举报