这是我的包含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()

09-07 09:14