2012-09-23 31 views
2

我有一个自定义类型的属性。重载qt属性

class foo : public QObject { 
    Q_OBJECT 
    Q_PROPERTY(Custom x READ x WRITE set_x) 

public: 
    void set_x(Custom &x) { /*whatnot*/} 
} 

QJson有效地调用下面的动态分配:

((QObject*)&foo_instance)->setProperty("x", QVariant(QString("something-from-json"))) 

返回false,如文档讲解:

如果该值不符合属性的类型兼容的,财产没有改变,并返回false。

我该如何将它填充到我的自定义值中?清楚地定义一个侧面功能void set_x(QString)void set_x(QVariant)不可能工作,因为属性系统将不知道这个访问器。

此外,检查类型兼容性在哪里? - 程序控制从未达到

int foo::qt_metacall(QMetaObject::Call _c, int _id, void **_a)

由元对象编译器生成的函数..

我怎样才能让这些类型Custom兼容吗?

+0

对接受的答案的评论实际上为我指出了。 – qdot

回答

2

它可以读取The Property System

特别是属性和自定义类型部分非常有用。

如果要简要说明,所有属性另存为QVariant。
您需要使用Q_DECLARE_METATYPE宏才能使您的自定义类型与Qt属性兼容。
之后,你必须拨打电话qRegisterMetaType函数来注册你的类型。

+1

是的,我读过这部分的文档 - 问题始于定义WRITE访问器 - 它需要是Custom(或Custom或Custom *,IIRC)类型 - 但我得到setProperty动态调用者来推动QVariant(QString).value()到那里。有一个Custom(QString)创建器,但我无法静态或动态地调用setProperty。并且声明WRITE访问器类型的set_x(QVariant&v)也没有帮助 - 它没有被调用。 – qdot

+2

如果我没有弄错,你只有一种方法 - 使用QString属性。如果你需要,你可以将QString转换为Custom类型为setter。 –