如何在 QJSEngine 中注册 QList<quint64> 之类的类型?

Posted

技术标签:

【中文标题】如何在 QJSEngine 中注册 QList<quint64> 之类的类型?【英文标题】:How to register types like QList<quint64> in QJSEngine? 【发布时间】:2019-09-15 06:04:28 【问题描述】:

我在我的 Qt 应用程序中使用 QJSEngine 编写脚本。我的 C++ 函数之一返回 QList&lt;quint64&gt; 类型,我需要从 javascript 调用它。调用它没有错误。但是,它返回 QVariant(QList&lt;qulonglong&gt;) 而不是预期的整数列表。在 C++ 中定义为返回 QList&lt;int&gt; 的另一个函数在 javascript 中可以正常工作,返回整数列表。我查看了QJSEngineQJSValue 的文档,并没有找到解决此问题的提示。附: quint64 本身也可以正常工作 - 只是它们的列表不起作用。

【问题讨论】:

JS 不支持 U64:***.com/questions/9643626/… 你没有提到 QML,但你可以像这样创建自己的类:***.com/questions/23781083/64-bit-integers-in-qml 那里发生的事情(很可能)是 Qt 是由于没有原生 JS 类型,因此将 U64 转换为变体列表。 【参考方案1】:

您应该改用 QVariantList。 QVariant 支持 qlonglong 和 qulonglong,与 qint64 和 quint64 相同。

QList<qlonglong> list;

或转换:

QVariant v(list);
QVariantList vlist = v.toList();

【讨论】:

这就是 Qt 已经为他做的事情(将列表包装在 QVariant 中)。关键是在 JS/ECMA 中没有任何 64b 整数的本机转换,无论是否有符号。 (有新的“Int64/UInt64 类型,但实际上是字节数组左右,Qt 不支持这些),所以没有内置的 Qt 辅助类将这些类型的数组转换为 JS 对象。AFAIK 没有办法添加自定义容器,除了通过专用类(具有值访问器方法的 QObjects/Gadgets,例如QQmlListProperty)。

以上是关于如何在 QJSEngine 中注册 QList<quint64> 之类的类型?的主要内容,如果未能解决你的问题,请参考以下文章

QML:如何从 C++ 中读取 QList

QJSEngine 删除我的 QObject,如何在 QJSEngine::newQObject 之后更改所有权?

如何从 Qt 5.12 中的 QJSEngine 获取标准输出?

如何清理或销毁 QJSEngine?

如何使用 QJSEngine 实例化 c++ 对象

如何使用 QJSEngine 构建 API?