![](/img/trans.png)
[英]Is there a way to use QMetaEnum with Q_ENUMS belonging to non Q_OBJECT or Q_GADGET class?
[英]QML can see my Q_GADGET but not Q_OBJECT
为什么我的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
上有一堆QString
和QVector3D
成员。
在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_OBJECT
和Q_GADGET
之间差异的原因是我正在制作我的对象的副本,这在Q_GADGET
( 值 )对象上是允许的,但不在Q_OBJECT
( 标识对象)上。请参阅标识而不是值 。
解决方案是始终使用指针处理Q_OBJECT
。 这保持了他们的身份 ,并避免复制。
此外,我最初的意图是使用智能指针,但在这个答案中解释了为什么这是一个糟糕的方法的原因。
@dtech的评论还解释了Q_DECLARE_METATYPE
在Q_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端读取它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.