QML 可以看到我的 Q_GADGET 但看不到 Q_OBJECT

2024-01-21

为什么我的可以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这样我就有了槽/信号。


我看到两者之间存在差异的原因Q_OBJECT and Q_GADGET是我正在复制我的对象,这是允许的Q_GADGET (a value) 对象,但不在Q_OBJECT (an identity对象。)参见身份而非价值观 https://stackoverflow.com/questions/31433260/passing-q-gadget-as-signal-parameter-from-c-to-qml.

解决方案是始终致力于Q_OBJECTs 带指针。这维持了他们的identity,并避免复制。

另外,我的初衷是使用智能指针,但这是一个不好的方法的原因在这个答案 https://stackoverflow.com/a/19411873/1861346.

@dtech 的评论还解释说Q_DECLARE_METATYPE是多余的Q_OBJECT.

因此,我的最终声明是:

i.e.

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 端读取它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QML 可以看到我的 Q_GADGET 但看不到 Q_OBJECT 的相关文章

随机推荐

  • 使用 OpenSSL API 验证 Authenticode 签名的可执行文件和 DLL

    我已经安装了openssl现在rsa test c运行良好 我想做的是 打开任何exe或dll数字证书 提取指纹 and 公钥 公钥包含exponent也是 如果您熟悉 ASN1 编码 现在我已经计算好了SHA 1文件的哈希值并将其与 MD
  • 按 F12 转到 Visual Studio 2015 / C# 中的定义时出现错误

    当我在 Visual Studio 2015 中按 F12 转到定义 时 收到以下错误消息 发生一个或多个错误 我已经尝试过 关闭解决方案 删除 suo 文件 重新构建解决方案 但这并没有解决问题 请帮忙 这是尝试访问外部程序集的元数据时
  • Celery任务无法通过channel_layer.send调用Channels消费者

    我一直在为一个相当简单的应用程序设置一个网络套接字 我编写了一个 JsonWebsocketConsumer 以及一些 celery 任务 以便执行一些长时间运行的任务 数据库访问 一切正常 没有错误 但我的消费者从未接到电话 有任何想法吗
  • 替换指定位置的部分字符串

    我想用javascript中的另一个字符串替换指定位置 开始 结束 的字符串的一部分 这是一个例子 Hello world this is a question 我想用 friends 替换该字符串中从 5 开始到 10 结束的部分 输出将
  • 在哪里实现缓存 - 类库或 Windows 服务

    我有一个 Windows 服务 它使用计时器定期调用类库 在工作线程上 该类库具有所有必需的应用程序功能 而 Windows 服务只不过是一个简单的托管环境 作为其执行的一部分 库需要调用数据库并获取一堆记录 这些记录不会经常更改 想想几周
  • 应用程序终止后无法保存我的首选项

    您好 我正在尝试在我的 Android 应用程序上实现一个设置页面 我定义了一个 xml Preference 文件 在其中实现了 CheckBoxPreference 和 EditTextPreference 运行应用程序时 所有设置都可
  • 如何在Python中获取表单字段名称和值?

    我在用 python 开发的网页中遇到问题 我的表单中有几个字段 复选框 文本区域等 每个字段都有一些唯一的名称 我可以保存已知字段的值 i e field name fl textarea field value form getvalu
  • 在 Three.js 中将带有孔的 SVG 路径转换为挤压形状

    我有一个由 4 个多边形组成的形状 2 个无孔多边形和 2 个有孔多边形 这只是一个例子 实际上 可能存在由 50 个多边形组成的形状 其中 20 个是非孔多边形 30 个是孔多边形 在 SVG 路径中 可以通过组合 moveto s 和
  • FreeMarker编码混乱

    当我使用 FreeMarker 读取 UTF 8 编码模板时 特殊字符在浏览器中正确呈现 尽管freeMarkerConfig getDefaultEncoding 返回 Cp1252 如果我设置freeMarkerConfig setDe
  • 删除mongoDB中数组字段大小小于3的文档

    我有一个名为的 mongoDB 集合col有类似这样的文档 intField 123 strField hi arrField 1 2 3 intField 12 strField hello arrField 1 2 3 4 intFie
  • 实现自重置 XMLHttpRequest 对象

    我正在尝试使用 XMLHttpResponse 对象实现彗星风格的长轮询连接 这个想法是保持与服务器的开放连接 该服务器在可用时发送数据 伪造推送 XHR 对象完成后 我需要生成一个新对象来等待任何新数据 下面是一段代码 概述了一个有效的解
  • 如何自动调整移动网站的图像大小?

    我尝试了谷歌搜索 但仍然无法弄清楚如何根据各种移动设备的宽度调整图像的大小 这是我的尝试 CSS img test width 100 height auto HTML
  • 确定两个未排序的数组是否相同?

    给定两个unsorted arrays A and B具有不同的元素 确定是否A and B可以重新排列 使它们相同 我的策略如下 首先 使用确定性选择算法O N 是时候找到Max of A and Max of B 如果他们没有相同的Ma
  • 读取由空格分隔的单词,并且字符串值在批处理脚本中也包含空格

    我需要从批处理脚本读取注册表的默认值 某些项目的名称包含一些空格 另外我想在批处理文件中执行 for 循环一次两次 rem echo OFF setlocal ENABLEEXTENSIONS set KEY NAME HKEY CURRE
  • 如何在 Play 之外使用 Anorm?

    在 Scala 之外如何使用 Anorm 在玩的 Anorm 文档中 它简单地使用了类似的内容 DB withConnection implicit c gt val result Boolean SQL Select 1 execute
  • clang-query:检查函数参数类型的模板参数名称

    我有一个大项目 以及大量以下形式的 C 类成员函数 Return CClass MemberFunction Arg1 arg1 std weak ptr
  • 应用程序崩溃但没有 TestFlight 崩溃报告

    我有一位用户 使用 iPhone 5 报告说 我的应用程序在屏幕变黑 启动画面为黑色 后大约 15 秒后崩溃 用户下载了 TestFlight 版本 其中我在应用程序委托中包含了检查点 但我没有得到这些检查点被交叉的证据 而且我从未收到崩溃
  • 我可以用C++中的成员变量地址获取对象的引用吗?

    如果我只有该对象的成员变量的地址 是否可以获得对该对象的引用 struct example int var int main example exampleObject int point exampleObject var can i g
  • 让查询与参数和“like”一起使用

    我见过很多关于在 Sql 查询和 like 中使用参数的问题 但我已经尝试了所有我见过的编码方法 但仍然无法让我的查询给出结果 如果我在查询本身中输入一个值 它就会正常运行 当我运行列出的第一个查询时 出现错误 必须声明标量变量 Searc
  • QML 可以看到我的 Q_GADGET 但看不到 Q_OBJECT

    为什么我的可以Q GADGET在 QML JS 中可以完美阅读 但不是我的Q OBJECT 在 Ubuntu 14 04 上运行 Qt 5 8 0 我正在尝试返回一个列表 QVariantMap 的对象到 QML 我现在保持简单 没有指针等