What is the difference between Q_ENUM and Q_ENUMS

22.8k Views Asked by At

I just found multiple examples showing the usage of Q_ENUM and Q_ENUMS and looking into the definition of Q_ENUM showed me that it includes Q_ENUMS and other definitions.

I am not sure which one to write when using the enum in Q_PROPERTY, Qml/QtQuick, in signals/slots, QVariants and qDebug() output.

It seems like the Q_ENUM is the better one as it is defined using Q_ENUMS, but I'm just guessing here.

What exactly are the differences, why are there two at all and which one should be prefered?

2

There are 2 best solutions below

0
On BEST ANSWER

The What's New in Qt 5.5 says:

Added Q_ENUM to replace Q_ENUMS, which allows to get a QMetaEnum at compile time using QMetaEnum::fromType. Such enums are now automatically registered as metatypes, and can be converted to strings within QVariant, or printed as string by qDebug().

5
On

Since Qt 5.5 Q_ENUMS is deprecated, replaced with the better Q_ENUM.

There is an example showing its use in the 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;
};

For further details on the reasons behind the move from Q_ENUMS to Q_ENUM, read this blog entry