gpt4 book ai didi

c++ - QML 可以看到我的 Q_GADGET 但看不到 Q_OBJECT

转载 作者:太空狗 更新时间:2023-10-29 23:12:50 31 4
gpt4 key购买 nike

为什么我的 Q_GADGET 可以在 QML (JS) 中完美读取,而我的 Q_OBJECT 却不能?

在 Ubuntu 14.04 上运行 Qt 5.8.0。

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

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)

Blob 上有一堆QStringQVector3D 成员。

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

qmlRegisterType<Blob>("matt", 1, 0, "Blob");

然后我的 JS 代码能够毫无问题地读取对象上的所有属性(循环迭代它们)。

但是如果我使用Q_OBJECT

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 接收到一个对象,其中所有属性都是来自 QVariantMap 的键,但其值是空对​​象。

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

Blob b;
qDebug() << "Created: " << b;
QVariant var = QVariant::fromValue(b);
qDebug() << " Converted back = " << var.value<Blob>().toQString();

我更喜欢使用 Q_OBJECT 这样我就有插槽/信号。

最佳答案

我之所以看到 Q_OBJECTQ_GADGET 之间的区别,是因为我正在复制我的对象,这在 Q_GADGET 上是允许的>()对象,但不在Q_OBJECT(identity 对象)上。参见identities instead of values .

解决方案是始终使用指针处理Q_OBJECT。这样可以保持他们的身份,并避免复制。

此外,我的初衷是使用智能指针,但在 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 端读取它们。

关于c++ - QML 可以看到我的 Q_GADGET 但看不到 Q_OBJECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43398740/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com