无法从另一个类中定义的枚举声明Q_ENUM

one*_*eno 6 c++ qt

该文件说明

如果要注册在另一个类中声明的枚举,则枚举必须使用定义它的类的名称进行完全限定.此外,定义枚举的类必须继承QObject,并使用Q_ENUMS()声明枚举.

但是,在下面的示例中,我无法使其工作.

A类:

#ifndef CLASSA_H
#define CLASSA_H

#include <classb.h>

class ClassA : public QObject
{
   Q_OBJECT
   Q_ENUMS(ClassB::TestEnum)

public:
   explicit ClassA(QObject *parent = 0) : QObject(parent)
   {
      const QMetaObject *metaObj = this->metaObject();
      qDebug() << metaObj->enumeratorCount();
   }
};

#endif // CLASSA_H
Run Code Online (Sandbox Code Playgroud)

ClassB的:

#ifndef CLASSB_H
#define CLASSB_H

#include <QDebug>
#include <QMetaEnum>
#include <QObject>

class ClassB : public QObject
{
   Q_OBJECT
   Q_ENUMS(TestEnum)

public:
   enum TestEnum { A, B, C };

   explicit ClassB(QObject *parent = 0) : QObject(parent)
   {
      const QMetaObject *metaObj = this->metaObject();
      qDebug() << metaObj->enumeratorCount();
   }
};

#endif // CLASSB_H
Run Code Online (Sandbox Code Playgroud)

主要:

#include <classa.h>
#include <classb.h>

int main() 
{
   ClassA objectA;
   ClassB objectB; 
}
Run Code Online (Sandbox Code Playgroud)

预期产量:

1

1

实际产量:

0

1

Eze*_*zee 5

以下是一项小研究的总结:

  • 文档中声明的关于在另一个类中声明的枚举的注册的信息看起来过时了.

  • Q_ENUMS(Class::EnumName 没有创建新的枚举器,也没用.

  • 当您Q_PROPERTY在ClassA中声明一个新的时,您应该使用枚举的完整形式ClassB::EnumName.

  • 只要EnumName在ClassB中注册,就不需要再注册了.

  • 使用另一个类的枚举器创建的属性可以正常工作.

    class ClassA : public QObject
    {
    public:
     Q_OBJECT       
     Q_PROPERTY(ClassB::TestEnum test READ test)
    
    public:
    explicit ClassA(QObject *parent = 0)
    {
        const QMetaObject *metaObj = this->metaObject();
        qDebug() << metaObj->enumeratorCount();
    
        QMetaProperty property = metaObj->property(metaObj->indexOfProperty("test"));
        if (property.isEnumType())
        {
            const QMetaEnum& enumerator = property.enumerator();
    
            qDebug() << enumerator.name();
    
            for (int i = 0 ; i < enumerator.keyCount(); i++)
            {
                qDebug() << QLatin1String(enumerator.key(i)) <<  enumerator.value(i);           
            }
        }
    }
    ClassB::TestEnum test() const
    {
        return ClassB::A;
    }
    };
    
    Run Code Online (Sandbox Code Playgroud)

输出:

0 
TestEnum 
"A" 0 
"B" 1 
"C" 2 
Run Code Online (Sandbox Code Playgroud)

  • 也许你应该向Qt bug跟踪器报告这个文档的不一致性. (3认同)