qt 如何注冊自定義類型?


  1. 如何聲明自定義類型
    如果僅僅在 QVariant 中使用,則僅需要使用 Q_DECLARE_METATYPE 宏進行聲明即可。
class Custom_ : public QObject
{
    Q_OBJECT
public:
    Custom_() {}
    virtual ~Custom_() {}
};
//注意:繼承 QObject 類型僅支持注冊指針類型
Q_DECLARE_METATYPE(Custom_*)

class Custom
{
public:
    Custom() {}
    QString name(){return "custom";}
};
Q_DECLARE_METATYPE(Custom)
  1. 如何在 QVariant 中使用?
    T QVariant::value() const
    void QVariant::setValue(const T &value)
    [static] QVariant QVariant::fromValue(const T &value)
QVariant var;
Custom custom;
var.set<Custom>(custom);

QString name = var.value<Custom>().name();

//
auto var = QVariant::fromValue<Custom_*>(new Custom_);
auto custom_ = var.value<Custom_*>();
if(custom_){
    //
}

如何需要在信號和槽中使用則需要額外調用 qRegisterMetaType<Custom>("Custom") qRegisterMetaType<Custom_*>("Custom_")進行注冊該類型.

使用 Q_DECLARE_METATYPE 宏,不會保證第一時間進行注冊該類型,需要調用該函數才會執行 qRegisterMetaType,so 我們需要手動第一時間進行注冊該類型。

#ifndef Q_MOC_RUN
#define Q_DECLARE_METATYPE(TYPE) Q_DECLARE_METATYPE_IMPL(TYPE)
#define Q_DECLARE_METATYPE_IMPL(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 (const int id = metatype_id.loadAcquire())           \
                    return id;                                          \
                const int newId = qRegisterMetaType< TYPE >(#TYPE,      \
                              reinterpret_cast< TYPE *>(quintptr(-1))); \
                metatype_id.storeRelease(newId);                        \
                return newId;                                           \
            }                                                           \
    };                                                                  \
    QT_END_NAMESPACE
#endif // Q_MOC_RUN


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM