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

2024-01-18

本文档 http://qt-project.org/doc/qt-4.8/qobject.html#Q_ENUMS states

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

但是,在下面的示例中,我无法完成这项工作。

Class 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

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

main:

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

int main() 
{
   ClassA objectA;
   ClassB objectB; 
}

预期输出:

1

1

实际输出:

1


以下是一些研究的总结:

  • 文档中有关注册另一个类中声明的枚举的信息看起来已经过时。

  • 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;
    }
    };
    

输出:

0 
TestEnum 
"A" 0 
"B" 1 
"C" 2 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐