首页 Qt Qt 5 将 JavaScript 作为程序开发一等公民

Qt 5 将 JavaScript 作为程序开发一等公民

2 1.8K

消息来源:http://arstechnica.com/business/news/2012/04/an-in-depth-look-at-qt-5-making-javascript-a-first-class-citizen-for-native-cross-platform-developme.ars

Qt 开发工具正在进行大的修改。本周,Qt 开发人员发布了 Qt 5 Alpha。这是 Qt 5 发布进程中的一个关键里程碑。

Qt 是一个开源工具库,用于跨平台的桌面和移动应用开发。Qt 提供了库、用户界面和其他组件。Qt 最初由 Trolltech 开发,这是一个挪威的软件公司。在 2008 年被 Nokia 收购。Nokia 随后将 Qt 授权修改为更为宽松的协议,并且将其作为社区型的开放项目。

Qt Quick 的崛起

Qt 5 带来很多技术上的和哲学上的有意义的变革。Qt 开发者希望将应用程序开发人员的精力由传统的 widget 系统(基于 QWidget C++ 类)转移到 Qt Quick。这是一种用于构建富界面的声明式脚本框架。这个改变将会把 Qt 应用程序开发人员的关注点转移出作为根基的 C++ 系统。

Qt Quick 允许开发者结合任意的图形资源、流畅的动画、高级触摸支持以及更好的交互来构建有特色的界面。Qt Quick 与 Qt 4.7 首次引入,目的是用于构建更好的移动应用。当时,Nokia 希望 Qt Quick 能够带给开发者为其年老的 Symbian 平台以及后来的基于 Linux 的移动操作系统开发更富有竞争力的应用程序。

随着 Qt Quick 的价值和技术优势日益显著,它最终成为 Qt 系统的更为核心的一员。在 Qt 5 中,它已经推荐位构建 Qt 用户界面的更好的方式。

Qt Quick 提供了一套独立的声明式语法,称为 QML,用于描述用户界面的布局结构。其语法类似 JSON,能够以属性和值的形式包含巨大的嵌套结构。JavaScript 的开发经验能够平滑地适用于 QML 布局中来。

在 Qt 4.7 和 4.8 中,开发者通过在常规的基于 QWidget 的用户界面中嵌入声明式控件的方式使用 Qt Quick。然后,该视图被配置加载和渲染一个 QML 布局。开发者通过 Qt 的 MVC 框架,使用 C++ 来实现其底层的应用程序逻辑和数据模型。之后,这些数据模型绑定到 QML 布局,而后者则显示用户界面。同 QtScript 类似,Qt Quick 框架能够很方便地将 C++ 对象、属性以及函数暴露给 QML 环境及其 JavaScript 运行时。问题在于,这所有一切都是使用 C++ 完成的,JavaScript 仅仅作为一种处理用户界面事件的“胶水语言”。

Qt 5 则是希望让 Qt 开发人员使用 QML 和 JavaScript 构建其应用程序,使用脚本编写应用程序逻辑。C++ 则只用来实现扩展 Qt Quick 运行时的插件。这就是 Qt 的发展方向,当然,或许需要等到今年年底才会真正完成。

最初的 5.0 版本将会是传统的,仅仅切换必要的架构,而不是实现全部的功能。根据发布说明,为了达到最终的新的开发模型,还要有一到两个版本的发布。

Qt Quick 2.0

Qt Quick 在底层已经有了深刻的变化,用于准备其新的责任。Qt Quick 画布已经在一个 OpenGL 场景框架上面重新构建,因此能够利用硬件加速技术。或许有些人还记得 2010 年曾经有一个类似的项目 rendering experiments,这些早期工作已经开始整合进 Qt 5。

这样做的结果是能够为 QML 获得更好的性能,更低的 CPU 负载。动画以及与图形相关的其他 QML 渲染都会更加平滑、更加高效。这种实现支持 OpenGL 和 OpenGL ES 2.0,能够在桌面计算机和支持合适的图形硬件的移动设备上正常工作。

Qt Quick 在 Qt 5 中的另一项重大改变时其底层的 JavaScript 引擎。在 Qt 4.7 和 4.8 中,Qt Quick 脚本运行时是 WebKit 的 JavaScriptCore 引擎。在 Qt 5 中,它将切换成 Google 的 V8 引擎。V8 被认为能够在典型的 QML 使用场景中极大地提升 JavaScript 的执行性能。

切换图形场景和 V8 将使 Qt Quick 能够胜任很多重量级的应用程序。Qt 应用开发人员不需要针对某些类型的程序必须使用 C++ 以便获得更好的性能。

除了这些架构上的改变,Qt 开发人员还大修了 Qt Quick C++ API,改变了其命名规则。标准的 QDeclarative 前缀被丢弃,取而代之的是 QQuick 前缀。

Qt Quick 还增加了一系列新的功能,其中有些是通过可选的插件实现的。例如 Qt 3D 提供了基于 QML 框架的高层次 API,用于渲染 3D 图形。它支持场景管理、光照、加载模型、纹理以及视点位置,也支持使用 QML 的声明式模型来管理动画和 3D 形状。

另一个新的插件支持集成在 QML 布局中映射和定位组件。在 Qt Quick 中,一个新的画布模块提供了通用的绘图接口。该接口使用关联了 HTML5 Canvas 元素的 JavaScript API。当然,也有用于绘制 2D 图形的模块。

Qt Quick 还有很多技术改变,能够促进 JavaScript、QML 和 C++ 的整合灵活性。例如,更好的支持 C++ 的非对象的序列类型暴露(例如 QStringList)为 QML 对象的属性。新的模块 API 支持 QML 类组织为不同的 namespace。同时,也允许在一个 JavaScript 文件中引入 QML 模块。

后记

对于“C++ 则只用来实现扩展 Qt Quick 运行时的插件。”这一观点,我已经在 Qt 邮件列表中同其他开发人员讨论,是不是我们需要将我们的程序的下一个版本由 C++ 切换到 Qt Quick,会不会在 Qt 5 和 6 之间会发生类似 Qt 3 和 4 的升级问题这类事情。有些开发人员认为,Ars Technica 的文章有些“夸大”,实际情况并不会如此。豆子还会继续关注这件事情。如果可能,希望有 Qt 开发人员对此作出解释。

2 评论

tree 2012年4月11日 - 15:38

“Qt Quick 框架能够很方面的将 C++ 对象”中方便写错了

回复
DevBean 2012年4月12日 - 09:09

感谢指出!已经修正。

回复

回复 DevBean 取消回复

关于我

devbean

devbean

豆子,生于山东,定居南京。毕业于山东大学软件工程专业。软件工程师,主要关注于 Qt、Angular 等界面技术。

主题 Salodad 由 PenciDesign 提供 | 静态文件存储由又拍云存储提供 | 苏ICP备13027999号-2