这是我的类,其中包含q_enum。由于我使用QVariant,我需要使用q_enum。原因是在我的应用程序中,有一个部分,我们称为qregistermetatype,如果可能的话,我们只想在1个位置注册metatype。
是否可以使用qregistermetatype而不是q_enum?有绩效原因吗?
class MyEnums : public QObject
{
public:
enum class SettingType
{
Integer,
String,
Boolean,
Float,
Double,
Enum,
};
Q_ENUM(SettingType)
};
- 您无需致电
qRegisterMetaType()
即可使用具有QVariant
的类型。通常,您只需要Q_DECLARE_METATYPE()
。 - 如果将类型用于排队的信号/插槽连接或
QObject::property
API,则只需要调用qRegisterMetaType()
。请注意,对于枚举类型,您甚至不需要在这些情况下致电qRegisterMetaType()
。 - 要致电
qRegisterMetaType()
,您仍然需要使用Q_DECLARE_METATYPE()
。因此,使用qRegisterMetaType()
您只需将Q_ENUM()
交易为Q_DECLARE_METATYPE()
。 -
使用
Q_ENUM()
允许您在运行时检索枚举值的名称:qDebug() << MyEnums::Integer // Will print "MyEnums::Integer" if using Q_ENUM() // Will print "0" if using Q_DECLARE_METATYPE()
首先,您需要将 q_Object 宏添加到您的枚举类中,没有该宏,您无法使用 Q_DECLARE_METATYPE 来声明它需要 Q_DECLARE_METATYPE 因为没有它,您的metatype注册了 qregistermetatype 将无法与 qvariant 。
,您的班级声明看起来像这样:
class MyEnums : public QObject
{
public:
enum class SettingType
{
Integer,
String,
Boolean,
Float,
Double,
Enum,
};
//Q_ENUM(SettingType)
Q_OBJECT
};
Q_DECLARE_METATYPE(MyEnums::SettingType);
在使用您的类型之前,请致电: qRegisterMetaType<MyEnums::SettingType>();
somethere。
测试它:
qRegisterMetaType<MyEnums::SettingType>();
auto val = MyEnums::SettingType::Double;
QVariant vt = QVariant::fromValue(val);
MyEnums::SettingType test = vt.value<MyEnums::SettingType>();
qDebug() << (test == val);