Q_ENUM和Q_ENUMS之间有什么区别

时间:2017-10-11 14:45:15

标签: c++ qt5 qmetatype

我刚发现多个示例显示Q_ENUMQ_ENUMS的使用情况,并查看Q_ENUM的定义,告诉我它包含Q_ENUMS和其他定义。

在信号/插槽,QVariants和Q_PROPERTY输出中使用qDebug(),Qml / QtQuick中的枚举时,我不确定要写哪一个。

似乎Q_ENUM是更好的,因为它是使用Q_ENUMS定义的,但我只是在这里猜测。

究竟有什么不同,为什么有两个,哪一个应该优先?

2 个答案:

答案 0 :(得分:5)

What's New in Qt 5.5说:

  

添加了Q_ENUM来替换Q_ENUMS,它允许在编译时使用QMetaEnum :: fromType获取QMetaEnum。这些枚举现在自动注册为元类型,可以在QVariant中转换为字符串,或者通过qDebug()打印为字符串。

答案 1 :(得分:2)

由于不推荐使用Qt 5.5 Q_ENUMS,请将其替换为更好的Q_ENUM

有一个示例显示了它在Qt documentation中的用法:

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)

public:
    MyClass(QObject *parent = 0);
    ~MyClass();

    enum Priority { High, Low, VeryHigh, VeryLow };
    Q_ENUM(Priority)

    void setPriority(Priority priority)
    {
        m_priority = priority;
        emit priorityChanged(priority);
    }

    Priority priority() const
    { 
        return m_priority; 
    }

signals:
    void priorityChanged(Priority);

private:
    Priority m_priority;
};

有关从Q_ENUMS迁移到Q_ENUM背后原因的详细信息,请阅读this blog entry