【发布时间】:2013-11-20 14:03:28
【问题描述】:
我的班级有枚举属性,我希望使用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 值?字符串包装器属性可以正常工作。
【问题讨论】:
-
真的是空的吗?您是否尝试过调用 QVariant::value<:color>()?另外,您是否尝试过使用 Q_DECLARE_METATYPE?
-
看来你是对的 .. QVariant::value<:color>() 返回了正确的 int 值。不幸的是,这对我没有多大帮助,或者是否可以从 QVariant 获取枚举类型并将其插入 QVariant::value
()? -
什么意思? QVariant::value<:color>() 已经返回枚举类型。
-
我希望在 for 循环中使用它并将属性绑定到小部件,因此需要某种通用枚举属性转换器。 Ps:加了Q_DECLARE_METATYPE,没用但是转换需要用到。
标签: qt enums qproperty qgadget