【问题标题】:overloading qt properties重载qt属性
【发布时间】:2012-09-15 07:26:25
【问题描述】:

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

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 与这些类型兼容?

【问题讨论】:

  • 对已接受答案的评论实际上为我确定了这一点。

标签: qt properties metaobject


【解决方案1】:

阅读The Property System会很有用

尤其是属性和自定义类型部分。

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

【讨论】:

  • 是的,我已经阅读了这部分文档——问题从定义 WRITE 访问器开始——它需要是自定义类型(或自定义&或自定义*,IIRC)——但我是让 setProperty 动态调用者将 QVariant(QString).value() 推到那里。有一个 Custom(QString) 创建者,但我无法让 setProperty 静态或动态调用它。并且声明类型为 set_x(QVariant &v) 的 WRITE 访问器也无济于事 - 它没有被调用。
  • 如果我没记错的话,你只有一种方法——使用 QString 属性。如果您需要,您可以将 QString 转换为自定义类型到 setter。
猜你喜欢
  • 2017-06-12
  • 2011-07-12
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多