- 如何聲明自定義類型
如果僅僅在 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)
- 如何在
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