2013-11-20 84 views
1

我的課有枚舉屬性,我希望訪問此屬性使用QObject*。當調用QVariant QObject::property (const char * name) const返回值爲枚舉類型的空QVariant對象::屬性(常量字符*名稱)常量返回空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值?字符串包裝屬性按其應有的方式工作。

+0

它真的是空的嗎?你有沒有嘗試過調用QVariant :: value ()?另外,你有沒有嘗試過使用Q_DECLARE_METATYPE? –

+0

似乎你是對的.. QVariant ::值()返回正確的int值。不幸的是,這並沒有多大幫助,或者從QVariant獲取枚舉類型並將其插入QVariant :: value ()? – krizajb

+0

你是什麼意思? QVariant :: value ()已經返回枚舉類型。 –

回答

0

看起來moc工具無法爲各個值生成字符串。 IMO問題是typedef。 嘗試簡單enum類的內部:

enum ColorType { 
    COLOR_RED = 0, 
    COLOR_BLUE 
}; 

或者typedefenum關鍵字:

typedef enum { 
    COLOR_RED = 0, 
    COLOR_BLUE 
} ColorType; 

我敢肯定,缺少enum關鍵字混淆商務部工具。

+0

沒有枚舉關鍵字是一個錯字,嘗試沒有typedef ..同樣,我想我必須使用StringWrapper。 – krizajb