本文档 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(使用前将#替换为@)