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

                
            
        
浙公网安备 33010602011771号