我有一个属性类型为enum class Foo
enum class Foo{A, B};
class Bar: public QObject {
Q_OBJECT
Q_ENUM(Foo)
Q_PROPERTY(Foo myCoolProperty READ myCoolProperty WRITE setMyCoolProperty)
Foo _foo;
public:
Bar();
Foo myCoolProperty() const;
void setMyCoolProperty(Foo v);
};
如何将myCoolProperty
视为枚举类型的属性?例如下一个代码
Bar *bar = new Bar();
const QMetaObject *m = bar->metaObject();
for(int i=0; i< m->propertyCount(); i++ ) {
QMetaProperty mp = m->property(i);
qDebug("name=%s, isEnumType=%d", mp.name(), mp.isEnumType() );
}
打印:
name = myCoolProperty,isEnumType = 0
例如,如果我将enum class
更改为enum
,则测试代码将打印isEnumType=1
。如何用isEnumType=1
制作enum class
?
答案 0 :(得分:0)
将Foo
移动到Bar
类中可以解决此问题。我认为Foo
枚举不属于Q_OBJECT(或Q_GADGET或Q_NAMESPACE)宏类时,不会正确注册。它仍然是有效的属性,只是类型未知。 AFAIK枚举本身无法注册,它必须属于其他一些带注释的(“元目标化” :-)类/命名空间。
ADDED :只需将枚举移入或移出Bar类的 public 空间,以查看它是否适用于前者。 class
说明符没有区别。如果检查staticMetaObject
与“动态” objectInstance->metaObject()
也没有区别。
enum /*class*/ Foo{A, B};
class Bar: public QObject {
Q_OBJECT
Q_PROPERTY(Foo myCoolProperty READ myCoolProperty WRITE setMyCoolProperty)
public:
//enum /*class*/ Foo{A, B};
Q_ENUM(Foo)
Bar() {}
Foo myCoolProperty() const { return _foo; }
void setMyCoolProperty(Foo v) {}
private:
Foo _foo;
};
typedef Foo foo_t;
//typedef Bar::Foo foo_t;
//Q_DECLARE_METATYPE(foo_t) // no difference
int main(int, char**)
{
//qDebug() << qRegisterMetaType<foo_t>(); // no difference
const QMetaEnum emeta = QMetaEnum::fromType<foo_t>();
qDebug() << emeta.isValid() << emeta.enumName();
const QMetaObject m = Bar::staticMetaObject;
for(int i=m.propertyOffset(); i< m.propertyCount(); i++ ) {
const QMetaProperty mp = m.property(i);
qDebug("name=%s, isEnumType=%d %d", mp.name(), mp.isEnumType(), mp.enumerator().isValid());
}
return 0;
}
#include "main.moc"
酒吧外面有Foo:
false
name=myCoolProperty, isEnumType=0 0
酒吧内有Foo:
true Foo
name=myCoolProperty, isEnumType=1 1