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)
2. 如何在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                                                  \
enum类型如何使用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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。