使用Qt5.x版本中的不同方面来开发应用程序,着重于新的Qt Quick的技术,提供了编写C++后端的必要内容,并扩展了QtQuick。
本章提供了关于Qt5高层次的概述。它对开发者有效的展示了不同的应用模式并且使用Qt5对应用程序进行预演。此外,该章的目的是提供Qt5内容的广泛概述以及如何联系Qt5的创造者。
一、前言
Qt5重点
Qt5是对非常成功的Qt4的完整补充。截止Qt4.8,Qt4已经历了7年。现在是时候做出一个
更令人称奇的工具包,Qt5主要聚焦于以下内容:
- 出色的图形:Qt Quick2基于OpenGL(ES)来构建场景视图。重写的图形堆栈提供的图形效果与易用性在这一领域达到了从未有过的一个新高度。
- 开发者生产力:QML和JavaScript是用于创建用户界面的主要手段。后端由C++驱动。JavaScript和C++之间的分割为前端开发人员集中精力创造漂亮的图形界面,后端的C++开发人员集中精力在稳定性、性能、延长运行时间提供了一个快速迭代。
- 跨平台移植:随着综合的Qt平台抽象,它现在可以更容易、更快地移植到一个更广泛的平台。Qt5围绕着Qt必备模块和附加组件,它允许操作系统开发人员专注于要领模块,并引出一个较小的运行时概念。
- 开放式开发:Qt目前在Qt-Project中真正开放。发展是开放的、社区性的。
二、Qt5介绍
Qt Quick是Qt5中使用的用户界面技术,Qt Quick的本身是多种技术的集合:
- QML - 标记语言用户界面
- JavaScript - 动态脚本语言
- Qt C++ - 高度便携增强的C++库
与HTML类似,QML是一种标记性语言。元素被标记在QtQuick的花括号Item{}中。它为创建用户界面、开发人员高效性、易于阅读性而设计。用户界面可以使用JavaScript代码来增强。QtQuick能够很容易使用QtC++来扩展自己的本地功能。简而言之UI被称为前端,本地部分称为后端。这可以让你从用户接口部分分割应用程序的密集计算和本地操作。
在一个典型的项目里,前端开发使用QML/JavaScript,后端代码、系统接口则使用QtC++开发。这让界面开发人员和功能开发人员之间的有一个自然的分割。通常情况下,后台使用Qt自己的单元测试框架进行测试,导出给前端开发人员使用。
让我们用QtQuick创建一个简单的界面,它可以展示QML语言的某些方面。最终,我们设计一个旋转风轮。
从一个main.qml空文档开始,所有的QML文件将以.qml结尾,作为一个标记性语言(如HTML)QML文档需要一个且只有一个根元素—在例子中有相同宽度、高度(500像素)的Rectangle元素。
import QtQuick 2.0
Image {
id: root
source: "Images/background.png"
}
因为QML不作任何限制,元素类型使用Image作为根元素,使用source属性作为根元素的背景图像。
注:
每个元素都具有属性,例如一个图象,有width、height,还有其它属性,像source。图像元素的size属性从图像尺寸自动扣除。否则,我们就需要设置width、height属性为一些有用的像素值。
最标准的元素都位于QtQuick 2.0模块—我们在第一行包含的import语句。
id特殊属性是可选的,并包含一个标识符,后来在在文件的其它地方中引用这个元素。重要提示:id属性一旦被设置就不能被更改,且不能在运行时设置。使用root作为ID为根元素只是一种作者的习惯,在较大QML文档中引用最顶层元素则可以预测。
风轮的用户界面的前景元素放置被替换为另一个图片。
通常情况下你的用户界面将被由许多不同的元素类型,而不仅仅是Image元素,像下面这个例子:
import QtQuick 2.0
Image {
id: root
Image {
id: wheel
anchors.centerIn: parent
source: "Images/pinwheel.png"
}
}
使用anchor属性放置风轮在中央位置,锚允许指定父和兄弟姐妹对象之间的几何关系。放在另一个元素的中心(anchors.centerIn: parent)。有left、right、top、bottom、centerIn,、fill、verticalCenter、horizontalCenter关系。当然,他们需要匹配,若锚在顶部元素的左侧则它没有任何意义。
所以我们设置风轮作为背景在父窗体的中心。
注:
有时候你需要精确做小的调整。这将有可能用anchors.horizontalCenterOffset或anchors.verticalCenterOffset。类似的调整属性也适用于所有其它锚。请咨询锚属性的完整列表的文档。
将一个图像作为根矩形元素的子元素展现了一种声明式语言的一个重要概念。描述用户界面层和分组的顺序,其中最顶层(矩形)是首先绘制的,子层在包含元素的局部坐标系中绘制。
为了使展现变得更有趣,我们想加上互动。想法是,当用户按下鼠标中的某处场景以便转动风轮。使用MouseArea元素。
import QtQuick 2.0
Image {
id: root
Image {
id: wheel
anchors.centerIn: parent
source: "Images/pinwheel.png"
MouseArea {
anchors.fill: parent
onClicked: wheel.rotation += 90
}
}
}
当用户点击它里面的覆盖面积时,鼠标区域发出的信号。可以连接到这个信号来覆盖onClicked功能。在这种情况下,参考风轮图像90度旋转。
注:
这适用于每一个信号,命名为:on + SignalName(如:onClicked)。当所有属性值发生了改变时,还发出一个信号,命名为:on + PropertyName + Changed(如:onValueChanged)。
如果一个属性改变你可以用onWithChanged观察。
现在,风轮可以旋转,但仍然不流利。旋转属性将立即更改。我们希望,属性90度改变随着时间的改变来进行。现在动画开始发挥作用。要启用此我们使用一个动画类型调用属性的行为,它指定定义属性的行为的每一个变化。这仅是几种类型声明一个动画。
import QtQuick 2.0
Image {
id: root
Image {
id: wheel
anchors.centerIn: parent
source: "Images/pinwheel.png"
MouseArea {
anchors.fill: parent
onClicked: wheel.rotation += 90
}
Behavior on rotation {
NumberAnimation {
duration: 250
}
}
}
}
现在,每当风轮旋转改变时,将会使用NumberAnimation为250毫秒的持续时间进行动画处理。因此,每个90度的旋转将消耗250毫秒。
现在,风轮看起来已经好多了。希望这可以让你更好地理解关于Qt Quick的程序是怎么工作。
Qt的构建模块
Qt5包括大量的模块。一般来说一个模块是开发者使用的库。有些模块在Qt应用平台里是强制性的。他们形成了一套名为Qt的必备模块。也有很多模块都是可选的,并形成了Qt添加功能模块。大多数开发人员不需要使用它们,但很高兴知道它们为共同挑战提供了无价的解决方案。
三、Qt的必备模块
Qt的必备模块强制应用在Qt启用平台里。他们提供的基础开发现代Qt5应用程序使用Qt Quick 2。
核心基础模块
Qt5模块的最小集合进行QML编程。
模块 |
描述 |
Qt Core |
使用其它模块的核心非图形类 |
Qt GUI |
图形用户界面(GUI)组件的基础类,包括OpenGL的。 |
Qt Multimedia |
处理音频、视频、广播、摄像头功能的类。 |
Qt Network |
使网络编程更容易,更轻便的类。 |
Qt QML |
QML和JavaScript的类 |
Qt Quick |
自定义用户界面构建高度动态的应用程序的声明性框架。 |
Qt SQL |
使用SQL集成数据库的类 |
Qt Test |
进行Qt应用程序和库单元测试的类。 |
Qt WebKit |
基于WebKit2实现的一个新的QML API类。参见Qt WebKitWidgets模块。 |
Qt WebKit Widgets |
Qt4中,WebKit1和QWidget-based类。 |
Qt Widgets |
用C++部件扩展Qt图形界面的类。 |
Qt插件
除了必不可少的模块,Qt还提供了软件开发的附加模块,它不是发行版的一部分。以下是附加模块的一个简短的列表。
- Qt 3D 一组使3D图形编程更容易和详述的API。
- Qt Bluetooth 使用蓝牙无线技术平台的C++和QML的API。
- Qt Contacts 访问地址簿/联系人数据库的C++和QML的API。
- Qt Location 提供了位置定位、测绘、导航、位置搜索的C++和QML的API。 NMEA的后端定位。
- Qt Organizer 访问的组织事件(待办事项,事件等)的C++和QML的API
- Qt Publish and Subscribe
- Qt Sensors 访问传感器的C++和QML的API。
- Qt Service Framework 使应用程序能够读取,浏览和订阅更改通知的C++和QML的API。
- Qt System Info 发现系统相关的信息和功能。
- Qt Versit 支持电子名片和的iCalendar格式
- Qt Wayland 只有Linux。包括Qt CompositorAPI(服务器)和Wayland平台插件(客户端)
- Qt Feedback 触觉和声音反馈给用户操作。
- Qt JSON DB Qt的一个无SQL对象存储。
注:
这些模块不是发行版的一部分,取决于有多少活跃的贡献者以及如何得到测试。
四、支持的平台
Qt支持多种平台。主要桌面和嵌入式平台也支持。通过Qt应用程序的抽象,如今可以则可以更容易地移植到自己的平台上。
在一个平台上测试Qt5比较耗时。一个子平台被qt-project选中来构建参考平台。这些平台通过系统测试彻底测试,以确保最佳的质量。不过提醒你:没有代码错误是免费的。