- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
为什么我的 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
(identity 对象)上。参见identities instead of values .
解决方案是始终使用指针处理Q_OBJECT
。这样可以保持他们的身份,并避免复制。
此外,我的初衷是使用智能指针,但在 this answer 中解释了为什么这是一种糟糕的方法。 .
@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 端读取它们。
关于c++ - QML 可以看到我的 Q_GADGET 但看不到 Q_OBJECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43398740/
在Qt中,我们知道Q_OBJECT是一个宏。在这种情况下,宏意味着什么?特别是我发现术语“宏”可能有几种不同的定义。 谢谢。 最佳答案 宏仅仅意味着Q_OBJECT实际上是一个C++宏。它在 src/
这个类没问题: #include class LiveImageItem : public QThread { Q_OBJECT public: LiveImageItem(QPix
我收到的错误: g++ -c -g -I/usr/lib/qt-3.3/include TCPEchoServer.cpp Product.h:22: error: ISO C++ forbids d
我在构建应用程序时收到以下链接器错误。 HIMyClass.obj:: error: unresolved external symbol "public: virtual struct QMetaO
文档指出: The Q_OBJECT macro must appear in the private section of a class definition that declares its
有个类似的问题here正在寻找解决方法和不错的指南 here它描述了 Qt 中的元对象系统。但这并没有直接解释为什么不能在元对象系统中使用模板类。这是一个令人讨厌的限制。 有人知道为什么吗? 最佳答案
有个类似的问题here正在寻找解决方法和不错的指南 here它描述了 Qt 中的元对象系统。但这并没有直接解释为什么不能在元对象系统中使用模板类。这是一个令人讨厌的限制。 有人知道为什么吗? 最佳答案
众所周知,Q_OBJECT 是实例,不可复制。 是否有任何一种语法糖可以复制任意 QObject 派生类的所有静态和动态属性? 这看起来很简单,但我找不到任何引用 - 显然自己实现一个应该很简单 -
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
当我在 Qt Creator 中创建一个新的 Q_OBJECT 类时,它会创建这个默认构造函数。我想添加另一个参数以便我可以传递用户输入,但我不确定如何执行此操作,因为 QObject 是第一个参数并
这是我的代码: 工具.h #include namespace Tinject { class ProbeCreator : public QObject {
我编写了一个扩展 QWidget 类的自定义 Qt 小部件。 让我们考虑以下代码: .h #ifndef SS_TEST_H #define SS_TEST_H #include class Tes
为什么我们通常只在私有(private)部分给出 Q_OBJECT? 我尝试了一个示例程序,在公共(public)部分给出它,我发现没有区别。 如果有人知道,你能告诉我原因吗。 最佳答案 默认情况下,
我有一个不使用 qmake 的遗留版本,但我想添加 QUdpSocket 并将其与信号和插槽连接。我有一个使用 Q_OBJECT 的类。如果我希望信号和槽可用但我没有使用 qmake,我需要做什么才能
我正在开发一个包含多个插件的 c++/Qt 程序。对于每个类,我必须定义一个如下所示的插件接口(interface): //my class class qwerty; //my interface
我有一个由 QFutureWatcher 触发的插槽。我正在尝试转换发件人以获得结果 QFutureWatcher>* QFW = qobject_cast>*>(sender()); 但不断得到 e
如何通过元编程制作基于 Q_OBJECT 的类(具有信号和/或槽的类)?我不在乎它是模板还是预处理器,两者似乎都不起作用,但我确实也需要它。 我想要的是能够将任意函数绑定(bind)到 Qt 信号。
我在一个项目中工作,其中在我需要继承的类中使用了 Q_OBJECT 宏。 已经定义了 Q_OBJECT 的类如下所示, class cBaseObject : public QObject, publ
我在 OSX Lion 中运行 QtCreator,每当我创建一个需要 Q_OBJECT 宏的类时,我都会在尝试构建我的应用程序时遇到错误。该类的代码如下,我收到的错误也是如此。有什么线索吗? 注意:
问题 自从从 Qt 5.10 升级到 Qt 5.11 后,我开始无法生成带有 QDoc 的文档。对于我现有的项目。 许多问题之一是文档中缺少函数,尽管源代码中存在相应的注释。 研究 我已设法将问题缩小
我是一名优秀的程序员,十分优秀!