这是我的包含Q_ENUM的课程。我需要使用Q_ENUM,因为我正在使用QVariant。原因是在我的应用程序中,有一段我们调用qRegisterMetaType,如果可能的话,我们只想在1个位置注册元类型。
是否可以使用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()
。
如果将在排队的信号/插槽连接中使用该类型,或者仅使用qRegisterMetaType()
API,则仅需要调用QObject::property
。请注意,对于这些枚举类型,在这种情况下甚至不需要调用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()