如何为Qt应用程序提供脚本支持?

8
我正在寻找一种脚本语言,可以集成到我的Qt5应用程序中。该应用程序具有公共API,可用于通过插件扩展应用程序。现在我想向应用程序添加一个脚本语言,该语言提供对整个公共API的访问。
该脚本语言必须满足以下要求
  • 可以从QT应用程序内执行脚本代码。
  • 用户可以从脚本语言访问文件系统、网络和创建图形元素。
  • 用户可以通过绑定访问我的QT应用程序的公共API。
  • 应该有一个生成器可用于自动生成我的公共API的脚本语言绑定。
  • 对于属于公共API的类,应该可以在QT应用程序和脚本引擎之间传递对象。

我评估了以下脚本语言:

  • Qt-Script,与QT-Script生成器一起使用。
    该脚本语言基于ECMAScript/Javascript,并且可以轻松地集成到QT应用程序中。它符合我所有的要求并且按预期工作。生成器可以用于为QT API本身生成绑定,也可以用于为我的应用程序的公共API生成绑定。不幸的是,qt-script模块将在qt5.5中被弃用,而脚本生成器也不再维护
  • Python
    似乎有几个python-qt绑定可用。
    Pyside可能还可以,但它似乎也是不活跃的。除此之外,我需要将Python嵌入到C++中,这在pyside中不受支持,但可以通过Python C API完成。

您建议哪些脚本语言和工具,能够满足我所有的要求?


2
QJSEngine和其他QML类替代了Qt-Script,并且可以实现一些(或全部)功能要求,即使您的应用程序最初不是基于QML构建。 - Pavel Strakhov
@PavelStrakhov 我已经了解了这个问题。但是与qt-script相比,功能确实非常有限。我怀疑脚本生成器是否可以修改以生成可比较的结果(使用qjsengine代替qt-script)。 - Timo
正如SaZ所说:目前QML是Qt的主要脚本环境。它甚至带有大量现有Qt类的绑定,并允许用户轻松创建新的UI! - Kuba hasn't forgotten Monica
QML 无法满足我的所有需求。用户不能直接访问文件系统和网络。此外,只有基于 QObject 的类可以提供给脚本引擎使用。 - Timo
1个回答

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接