Qt 5 Alpha

作者:Zhen Zeng | Apr 16, 2012 1:15:12 PM

原文链接 Lars Knoll - Qt 5 Alpha

今天我们发布了Qt 5的Alpha版本,这是自进驻Qt Project以来推出的第一个主要版本。大家的努力工作使得这个发布成为可能。这个alpha版本大量的工作与引入的特性是由那些非Nokia员工所贡献的。很高兴的看到这个项目已经成为一个交流的平台,能让人们共同推进Qt。

此次Qt 5 Alpha发布的主要目的是获取反馈以帮助我们改进以后的发布。对于Alpha版,我们着重于Qt Essential模块,这些模块构成了Qt5提供的功能的基础。。

Alpha版本可以在http://qt-project.org/wiki/Qt-5-Alpha下载。请注意此alpha版只以源码形式的发布,没有可供下载的二进制版本,所以您得自己编译二进制文件。编译介绍参见http://qt-project.org/wiki/Qt-5-Alpha-building-instructions

自从去年5月我在一篇博客中概述了这个想法以来,我们已经在Qt 5上工作了差不多9个月了。那篇博客讲了我们在Qt 5中的几个目标,现在我想稍微反映些我们已经实现的部分。

理念

有一个基础的理念引领了大部分的Qt 5开发工作:

”Qt 5应当成为全新应用开发方式的基础。 一方面使用C++提供本地化Qt的全部能力,同时重点应当转移到一个模型上,这个模型使C++主要被用来实现Qt Quick模块化的后台功能。“

我要说的是我们在Qt 5上有一个好方法向着这个理念靠近。这个模型在那些UI是全屏的嵌入式Qt上工作良好。对于桌面环境,我们已经针对所需的这个模型打下了许多基础,但是我们在5.1或者5.2发布的时候才能确切地让这个模型可用。

开放的开发

我们希望在开放中开发Qt 5,围绕着一个强健的社区。自推出qt-project.org以来,我们看见了一个充满活力的社区,并且我们在Qt 5中的许多补丁与新特性都是由社区提供的。

架构的四大变化

我们已经着手对四个主要的Qt内部架构进行修改:

  1. 把全部的Qt接口迁移到Qt Platform Abstraction(QPA)层之上 —— 使得Qt能更容易移植到另外的视窗系统和设备上

    使用QPA,我们从根本上改变了Qt如何集成相关操作系统的视窗环境。QPA在Qt 4.8中作为QWS/Qt嵌入式的一种替代引入,但是现在完全使用在所有平台上。这个迁移带来了大量的工作并且迫使我们重写了很大一部分的纯平台相关的代码。但是它也帮助我们创造了一个更干净的架构,使得平台依赖代码能够得到很好的抽象。可以看到,新的抽象化能显著地简化对于新视窗系统的集成工作,并且为QNX,Android和IOS编写的后台证明了这点。

  2. 重新设计了图形堆栈 - 与Qt 4相比提高了性能,使用Qt Quick和OpenGL (ES) 2.0

    Qt 5为Qt Quick引入了全新的图形架构,使用了基于OpenGL的场景图(Scenegraph)。最低需求:OpenGL (ES) 2.0。QtGui现在包含了一组QOpenGL类,用以替代老的QGL类(为了兼容性这些类仍然可以使用)。我们还引入了一个比QApplication更轻量级的新类QGuiApplication和一个处理屏幕上顶层窗口的类QWindow。以QWidget为基础的那些类仍然像Qt 4.x一样工作,基于QPainter。然后QPainter比起以前支持更少的后端。它现在限制了于使用软件光栅(Raster bankend)来绘制屏幕、像素与图像,一个OpenGL后端提供GL接口以及一个提供PDF生成与打印的后端。平台依赖的后端比如X11或者CoreGraphics已经去掉了。这使得我们可以引入新的长期支持的图形架构的同时保证Qt 4.x的QWidget部分的完整兼容性。

  3. 更加灵活的模块化库结构,满足桌面和移动的融合 - 按照需要添加或删除用户特定的模块,Qt mobility API的完整实现

    这主要是一些内部的清扫工作,一般不会被Qt开发者们直接看到。但是模块化Qt库使得我们能够更容易更独立的推进Qt的不同部分。这在Qt 5稳定过程以及我们发布Qt5.0开始保持二进制兼容性的时候显得日益重要。模块化的工作还没有完全搞定,特别是qtbase库仍然包含了很多需要被拆分的模块。所以这部分工作很可能在5.0出来之后还会继续。Qt的模块化还使得从第三方模块到Qt的集成容易了很多。它同样能很好地响应来自笔记本、平板和手机的不同需求趋势,比如有关手机特殊特性的地点、传感器等需求。Qt 5中我们能看到Qt mobility API集成进了Qt —— 其中部分API是一组被称为“Qt Essentials”模块的一部分。提供了这些模块之后,其它的模块就能以简单方式加入了。我们现在已经确认Qt5能比以往任何Qt版本提供更丰富的功能特性清单。请注意此alpha版本就是重点关注Qt Essentials。

  4. 拆分全部QWidget相关的功能到其自有的类库

    通过拆分QWidget到独立的库中,我们不但确保了那些喜欢QWidgets的朋友可以继续使用它们,也为全部使用QML和Qt Quick的UI模型提供了途径。拆分QWidget为基础的功能到其自有的类当中是达到一个长期保持Qt 5架构干净的一个衡量之后的好措施。

这些改变的发表带来了许多反馈,早前我们已经给出了关于Qt 5和架构改变产生的一些常见问题。

新功能

除了架构的改变之外,Qt 5同样提供了许多新功能。在这里我突出介绍其中的一部分,详细的清单在我们的wiki中有描述。

  • Qt Core

QtCore已添加了许多新特性。现在有一个QStandardPaths类来提供对应平台的媒体、文档之类的标准位置。Core还包含了一个以二进制进行速度优化的JSON解析器。我们引入了对插件形式和文件内容的Mime类型的识别。Core同时还加入了一种新的可以在编译时检查信号/槽的连接的语法,以及一个完整的新的Perl兼容的正则表达式引擎。我们重写与优化了许多数据结构以获得更好的性能。我们也有意义的加入了C++11的支持,同时Qt也能继续在C++98兼容的编译器上编译运行。

  • Qt Gui

所有基于QWidget的类都被拆分到了QtWidgets库中。QtGui通过QWindow类获得了顶层界面的支持,同时现在有了内置的OpenGL支持。

  • Qt Network

我们加入了对DNS查找的支持并移除了QHttp和QFtp类(对那些还需要使用它们的人来说这些类可以独立使用)。还有许多和上面提到的类似的优化。

  • Qt Widgets

移植到了新的QPA架构之上而且可以像在Qt 4.x时那样使用。

  • Qt Quick

来自Qt 4.x时代的Qt Quick现在也完美兼容并叫做Qt Quick 1模块。这个模块已经完成不会再得到任何更新了。现在这部分的焦点是新的Qt Quick和Qt Qml模块。Qt 5中我们把Qt Quick的图像部分从QML和JS语法中拆分到不同模块了。新的JS类(QJSEngine和QJSValue)现在使用Google的V8引擎作为场景的后台,提供了更好的JavaScript性能。Qt Quick模块包含了基于OpenGL的场景图和在Qt 4.x就有了的全部基础项。我们加入了对基于GL的阴影、粒子和其它许多特效的支持。在QML侧大部分东西都是源码兼容的,但是如果用C++写的QML项则需要一些修改来适应这个新的场景图。

  • Qt 3D and Qt Location

一些额外的模块加入到了Qt Essentials组中,其中值得一提的是Qt 3D用来整合Qt和3D内容,和Qt Location用来提供GPS访问,地图和其它基于地址的服务。

  • Qt Webkit

自Qt 4.x以来Webkit的C++ API就没有变化过,但是Qt Webkit得到了来自webkit.org的版本更新,带给了我们许多性能的提高以及更好的HTML 5支持。这次的alpha版本在Windows关闭了这个选项,因为目前的编译工作还稍显复杂。我们正在努力工作,以确保在Beta版本中能重启这个功能并正常工作。

从Qt 4.x 到Qt 5的迁移

在Qt 4.x与Qt 5之间有少量的二进制以及源码兼容性差异。但是我们努力调整使得能够简单平滑的把现有代码过渡到Qt 5支持的形式。一个例子就是目前我们有Qt Creator,它用同样的代码编译在Qt 4.x和Qt 5之上。

如果您想在您的项目上尝试Qt 5,您可以在这里查看详细的迁移指导手册。

同时也请注意没有必要现在就直接把您的程序迁移到Qt 5,Qt 4.8仍然被社区以及Digia这样的公司所支持。但是我们深信Qt 5有足够的好处值得让您迁移。

下一步

可以看到自从Qt 5.0开始发展以来已经发生了很多东西。我为我们目前的成就感到高兴。您现在就可以开始下载alpha,试用它并给予反馈来帮助我们完善Qt 5。

所有的反馈应当发在qt开发人员列表(development@qt-project.org, 参见lists.qt-project.org)或者简单地在我们的bug跟踪系统中提交一个bug。当然非常欢迎任意的补丁和bug修复,请提交到codereview.qt-project.org

Alpha版本是迈向Qt 5最终发布的第一步,从现在起重点就在解决剩下的问题以便我们能尽快交付一个最终的Qt 5.0出来。

为了达到这一点已经有很多的人参与进来了,但是我想说的是,感谢每一位对这个发布做出贡献的人。

Enjoy!

Lars