如何使用Qregistermetatype而不是Q_enum



这是我的类,其中包含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)
};
  1. 您无需致电qRegisterMetaType()即可使用具有QVariant的类型。通常,您只需要Q_DECLARE_METATYPE()
  2. 如果将类型用于排队的信号/插槽连接或QObject::property API,则只需要调用qRegisterMetaType()。请注意,对于枚举类型,您甚至不需要在这些情况下致电qRegisterMetaType()
  3. 要致电qRegisterMetaType(),您仍然需要使用Q_DECLARE_METATYPE()。因此,使用qRegisterMetaType()您只需将Q_ENUM()交易为Q_DECLARE_METATYPE()
  4. 使用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);

相关内容

  • 没有找到相关文章