为什么我的可以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)
有一堆QString
and QVector3D
会员于Blob
.
在 main.cpp 中,我还注册了类型:
qmlRegisterType<Blob>("matt", 1, 0, "Blob");
然后我的 JS 代码就能够毫无问题地读取对象上的所有属性(for 循环迭代它们)。
但如果我使用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)
然后 US 收到一个对象,其中所有属性都是来自QVariantMap
,但其值为空对象。
请注意,在将其发送到 JS 之前,我将其转换为 QVariant 并再次转换回来,只是为了确认其有效,例如
Blob b;
qDebug() << "Created: " << b;
QVariant var = QVariant::fromValue(b);
qDebug() << " Converted back = " << var.value<Blob>().toQString();
我更喜欢使用Q_OBJECT
这样我就有了槽/信号。