如何在 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<quint64>
类型,我需要从 javascript 调用它。调用它没有错误。但是,它返回 QVariant(QList<qulonglong>)
而不是预期的整数列表。在 C++ 中定义为返回 QList<int>
的另一个函数在 javascript 中可以正常工作,返回整数列表。我查看了QJSEngine
和QJSValue
的文档,并没有找到解决此问题的提示。附: 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> 之类的类型?的主要内容,如果未能解决你的问题,请参考以下文章
QJSEngine 删除我的 QObject,如何在 QJSEngine::newQObject 之后更改所有权?