QML可以看到我的Q_GADGET而不是Q_OBJECT

时间:2017-04-13 17:52:13

标签: c++ qt qml

为什么我的json.dump(JsonResponse,file)可以在QML(JS)中完美阅读,但不能在我的Q_GADGET中阅读?

在Ubuntu 14.04上运行Qt 5.8.0。

我正在尝试将对象列表(Q_OBJECT)返回给QML。我现在保持简单,没有指针等等。只是对象的副本。

QVariantMap

struct Blob { Q_GADGET Q_PROPERTY(QString uuid MEMBER uuid_ CONSTANT) Q_PROPERTY(QVector3D centroid MEMBER centroid_) // ... Blob() {}; ~Blob() = default; Blob(const Blob& blob); }; Q_DECLARE_METATYPE(Blob) 上有很多QStringQVector3D个成员。

在main.cpp中,我还注册了类型:

Blob

然后我的JS代码能够在没有问题的情况下读取对象上的所有属性(用于循环遍历它们)。

但是如果我使用qmlRegisterType<Blob>("matt", 1, 0, "Blob");

Q_OBJECT

然后JS接收一个对象,其中所有属性都是来自struct Blob : public QObject { Q_OBJECT Q_PROPERTY(QString uuid MEMBER uuid_ CONSTANT) Q_PROPERTY(QVector3D centroid MEMBER centroid_) // ... explicit Blob(QObject parent = nullptr) : QObjecT(parent) {}; ~Blob() = default; Blob(const Blob& blob); }; Q_DECLARE_METATYPE(Blob) 的键,但其值是空对​​象。

注意,在将它发送给JS之前,我将其转换为QVariant并再次返回以确认其有效,例如。

QVariantMap

我更喜欢使用Blob b; qDebug() << "Created: " << b; QVariant var = QVariant::fromValue(b); qDebug() << " Converted back = " << var.value<Blob>().toQString(); ,以便我有插槽/信号。

1 个答案:

答案 0 :(得分:0)

我看到Q_OBJECTQ_GADGET之间存在差异的原因是我正在制作我的对象的副本,这是Q_GADGET允许的()对象,但不在Q_OBJECT身份对象)上。请参阅identities instead of values

解决方案是始终使用指针处理Q_OBJECT s。这样可以维护身份,并避免复制。

另外,我最初的意图是使用智能指针,但this answer解释了为什么这种方法不好的原因。

@dtech的评论还解释Q_DECLARE_METATYPEQ_OBJECT是多余的。

因此,我的最后声明是:

class Blob : public QObject
{
  Q_OBJECT

  Q_PROPERTY(QString uuid MEMBER uuid_ CONSTANT)
  Q_PROPERTY(QVector3D centroid MEMBER centroid_)
  // ...

  explicit Blob(QObject parent = nullptr) : QObjecT(parent) {};
  ~Blob() = default;
  Blob(const Blob& blob);
};

有了这个,我可以轻松地在QVariantMap中放置一个指向这些对象的原始指针,并且可以在QML / JS端读取它们。