【问题标题】:How to provide Scripting support for Qt-Applications?如何为 Qt 应用程序提供脚本支持?
【发布时间】:2015-05-27 11:37:55
【问题描述】:

我正在寻找一种可以集成到我的 Qt5 应用程序中的脚本语言。该应用程序有一个公共 api,可用于通过插件扩展应用程序。现在我想向应用程序添加一种脚本语言,它提供对整个公共 api 的访问。 脚本语言必须满足以下要求:

  • 脚本代码可以在 QT 应用程序中执行。
  • 用户可以访问文件系统、网络并使用脚本语言创建图形元素。
  • 用户可以通过绑定访问我的QT应用的公共api。
  • 应该有一个生成器可以为我的公共 api 自动生成脚本语言绑定。
  • 对于属于公共 Api 的类,应该可以在 QT 应用程序和脚本引擎之间传递对象。

我评估了以下脚本语言:

  • Qt-Script,连同 QT-Script Generator。
    脚本语言基于 ECMAScript/Javascript,可以轻松集成到 QT 应用程序中。这满足了我的所有要求并按预期工作。生成器可用于为 QT-Api 本身生成绑定,并为我的应用程序的公共 api 生成绑定。遗憾的是,qt-script 模块将在 qt5.5 中弃用,并且脚本生成器不再维护。
  • Python
    似乎有几个可用的 python-qt 绑定。​​
    Pyside 可能没问题,但它似乎也inactive。除此之外,我必须将 python 嵌入到 c++ 中,pyside 不支持开箱即用,但可以通过 python c api 完成。

您建议使用哪些脚本语言和工具来满足我的所有要求?

【问题讨论】:

  • QJSEngine 和其他 QML 类取代了 Qt-Script 并且应该能够满足您的部分(或全部)要求,即使您的应用程序最初不是基于 QML。
  • @PavelStrakhov 我读到过。但与 qt-script 相比,功能确实有限。我怀疑是否可以修改脚本生成器以生成可比较的结果(使用 qjsengine 而不是 qt-script)。
  • 正如 SaZ 所说:QML 目前是 Qt 的 脚本环境。它甚至带有很多与现有 Qt 类的绑定。它还允许您的用户轻松创建新的 UI!
  • QML 不能满足我的所有要求。用户无法开箱即用地访问文件系统和网络。此外,脚本引擎只能使用基于 QObject 的类。

标签: c++ qt scripting


【解决方案1】:

SWIG 与 Python 似乎是一个不错的选择。 SWIG 仍在积极维护中。

虽然 SWIG 不能开箱即用地满足我的所有要求,但让所有这些要求都能发挥作用应该不是什么大事:

脚本代码可以在 QT 应用程序中执行。

开箱即用不支持此功能。您必须将 python 解释器嵌入到您的应用程序中。 https://docs.python.org/2/extending/embedding.html

用户可以使用脚本语言访问文件系统、网络和创建图形元素。

访问文件系统和网络应该不是 python 的问题。要创建图形用户界面,有很多可用的库:
https://wiki.python.org/moin/GuiProgramming

  • 用户可以通过绑定访问我的QT应用的公共api。
  • 应该有一个生成器可以为我的公共 api 自动生成脚本语言绑定。

这是由 SWIG 完成的。它们提供了出色的 C++ 和 c++11 支持。

对于属于公共 API 的类,应该可以 在 QT 应用程序和脚本之间传递对象 引擎。

这可以使用 swig 提供的 c++ 函数来实现:

  • SWIG_TypeQuery 获取有关 C++ 类型的信息
  • SWIG_NewPointerObj 将 c++ 对象转换为 python(代理)对象
  • SWIG_ConvertPtr 将 python(代理)对象转换回 c++ 对象

更多信息在External runtime chapter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2014-11-14
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    相关资源
    最近更新 更多