1

私のクラスには 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 値を返すのはなぜですか? 文字列ラッパー プロパティは正常に機能します。

4

2 に答える 2

1

コードには、コンパイルを妨げるいくつかの誤りがありました。

  1. QObject から継承せずに Q_OBJECT を使用する。
  2. qRegisterMetaTypeQ_ENUM を使用する場合は必要ありません (5.5 で廃止された古いバージョンの Q_ENUMS を置き換えるために使用しました)。
  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"
于 2021-12-30T13:21:42.130 に答える
0

その moc ツールは、それぞれの値の文字列を生成できないようです。IMOの問題はtypedefenumクラス内で簡単に試してください:

enum ColorType {
  COLOR_RED = 0,
  COLOR_BLUE
};

またはキーワードtypedefで:enum

typedef enum {
  COLOR_RED = 0,
  COLOR_BLUE
} ColorType;

enumキーワードがないと moc ツールが混乱することは間違いありません。

于 2013-11-20T16:49:39.590 に答える