2

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

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,如 Qt 中所述:

如果该值与属性的类型不兼容,则不会更改该属性,并返回 false。

如何将其填充到我的自定义值中?明确定义一个副功能void set_x(QString)void set_x(QVariant)不可能工作,因为属性系统将不知道这个访问器。

另外,类型兼容性在哪里检查?- 程序控制永远不会到达

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

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

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

4

1 回答 1

2

阅读财产系统可能很有用

特别是属性和自定义类型部分。

简而言之,所有属性都保存为 QVariant。
您需要使用Q_DECLARE_METATYPE宏来使您的自定义类型与 Qt 属性兼容。
之后,您必须调用qRegisterMetaType函数来注册您的类型。

于 2012-09-23T19:55:58.517 回答