qRegisterMetaType<Block>(); 注册类型,并返回id

https://www.cnblogs.com/cute/archive/2011/11/17/2252686.html

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 @ 2018-06-16 00:52  sky20080101  阅读(167)  评论(0)    收藏  举报