对象::property(const char*name)const返回空的QVariant



我的类具有enum属性,我希望使用QObject*访问此属性。调用QVariant QObject::property ( const char * name ) const时,返回值为枚举类型的空QVariant

考虑以下代码:

/* Interface class */
class IFoo
{
Q_GADGET
public:
  Q_ENUMS(ColorType)
  typedef enum
  {
    COLOR_RED = 0,
    COLOR_BLUE
  } ColorType;
  virtual QString Name(void) const = 0;
};
Q_DECLARE_METATYPE(IFoo::ColorType)
class Foo
  : public IFoo
{
Q_OBJECT
public:
  Foo(void) 
  {
    qint32 typeId = qRegisterMetaType<IFoo::ColorType>("ColorType");
    qRegisterMetaTypeStreamOperators<int>(IFoo::ColorType);
  }
  virtual QString Name(void) const { return _name; }
  void SetColor(ColorType color) { _color = color; }
  ColorType Color(void) const { return _color; }
  QString ColorString(void) const { return _color == IFoo::COLOR_RED ? "Red" : "Blue"; }
  Q_PROPERTY(IFoo::ColorType Color READ Color WRITE SetColor)
  Q_PROPERTY(QString ColorString READ ColorString)
private:
  ColorType _color;
  QString _name;
};
int main (int argc, char **argv) {
  QCoreApplication app(argc, argv);
  Foo f;
  f.SetColor(IFoo::COLOR_RED);
  qDebug() << f.property("Color"); // Returns QVariant(IFoo::ColorType, ) 
  qDebug() << f.property("ColorString"); // Returns QString(Red)
}

为什么属性返回空的QVariant值?字符串包装器属性正常工作。

代码中有几个错误阻止了它的编译:

  1. 使用Q_OBJECT而不从QObject继承
  2. 如果您使用Q_ENUM(我用它来代替Q_ENUMS,它是旧版本,在5.5中已弃用),则不需要qRegisterMetaType
  3. qRegisterMetaTypeStreamOperators被传递了一个int作为模板参数,而不是要注册的类型,函数的参数(而不是模板参数)应该是字符串,这是可选的;但不是一种类型

完整来源:

#include <QtCore> // Just for the test. Use more fine grained includes.
/* Interface class */
class IFoo
{
Q_GADGET
public:
  enum ColorType
  {
    COLOR_RED = 0,
    COLOR_BLUE
  };
  Q_ENUM(ColorType)
  virtual QString Name(void) const = 0;
};
class Foo : public QObject, public IFoo
{
Q_OBJECT
public:
  Foo(void) 
  {
    qRegisterMetaTypeStreamOperators<IFoo::ColorType>();
  }
  virtual QString Name(void) const { return _name; }
  void SetColor(ColorType color) { _color = color; }
  ColorType Color(void) const { return _color; }
  QString ColorString(void) const { return _color == IFoo::COLOR_RED ? "Red" : "Blue"; }
  Q_PROPERTY(IFoo::ColorType Color READ Color WRITE SetColor)
  Q_PROPERTY(QString ColorString READ ColorString)
private:
  ColorType _color;
  QString _name;
};
int main (int argc, char **argv) {
  QCoreApplication app(argc, argv);
  Foo f;
  f.SetColor(IFoo::COLOR_RED);
  qDebug() << f.property("Color"); // Returns QVariant(IFoo::ColorType, ) 
  qDebug() << f.property("ColorString"); // Returns QString(Red)
  // Now returns:
  // QVariant(IFoo::ColorType, "COLOR_RED")
  // QVariant(QString, "Red")
}
#include "main.moc"

看起来moc工具无法为各个值生成字符串。IMO问题是typedef。在类内尝试简单的enum

enum ColorType {
  COLOR_RED = 0,
  COLOR_BLUE
};

typedefenum关键字:

typedef enum {
  COLOR_RED = 0,
  COLOR_BLUE
} ColorType;

我确信缺少enum关键字会混淆moc工具。

最新更新