如何将“枚举类Foo”属性的类型视为“枚举”类型?

时间:2019-11-26 12:21:56

标签: qt enums qt5

我有一个属性类型为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

1 个答案:

答案 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