QML BOOK 第一章 Meet to Qt

来源:互联网 发布:js array prototype 编辑:程序博客网 时间:2024/06/05 14:20

1. Meet Qt 5

注意
这章的源代码能够在http://qmlbook.org/assets/中找到。

在这一章是对于Qt5的一个概述,它展示了开发者可以使用的不同开发模型和Qt5程序的预演。另外本章的内容提供一个广泛的Qt5概述和如何与Qt的开发者联系。
这本书向你提供了使用Qt开发不同的应用程序。它主要关注了新的Qt Quick的技术,但也提供了如何使用C++渲染后端的方法和Qt Quick的扩展方法。

1.1 序

历史

Qt4自2005年发布以来向成千上万的应用程序提供了开发框架,甚至是完整的桌面与移动系统。在最近几年计算机的使用模式发生了改变。从PC机向便携式设备和移动电脑发展。传统的桌面设备被越来越多的基于触摸屏的手机设备取代。桌面用户的体验模式也在发生改变。在过去,Windows UI占据了我们的世界,但现在我们会花更多的时间在其它的UI语言上。
Qt4设计用于满足在大多数主流平台的桌面上有一个可以使用的UI窗口部件。如今对于Qt的开发者面临新的问题,它将提供更多的基于用户触摸驱动的用户界面并且适用于大多数主流桌面与移动系统。Qt4.7开始引进了QtQuick技术,允许用户创建一个满足客户需求的,从简单的元素来实现一个完整的新的用户界面。

1.1.1 Qt5关注方面

​Qt5是Qt4版本完整的更新,到Qt4.8版本,Qt4已经发布了7年。是时候让这个令人惊奇的工具更加惊奇了。Qt5主要关注以下方面:
  • 杰出的图形绘制:Qt Quick2是基于OpenGL(ES)场景的实现。重组的图形堆栈可以得到更加好的图形效果与更加简单的使用方法,在这一领域是之前是从未实现的。
  • 开发者生产率:QML和JavaScript语言是主要用于创建UI的方法。后端将有C++来完成绘制。将JavaScript与C++分开能够快速的迭代开发,让前端的开发人员专注于创建漂亮的用户界面,后端的C++开发人员专注于稳定,性能和扩展。
  • 跨平台移植性:基于Qt平台的统一抽象概念,现在可以更加容易和快速的将Qt移植到更多的平台上。Qt5是一个围绕Qt必要组件和附加组件的概念,操作系统开发者只需要专注于必要模块的实现,可以使程序更加效率的运行。
  • 开放的开发:Qt是由Qt-Porject(qt-project.org)主持的开放管理的项目,它的开发是开放的,由Qt社区驱动的。

1.2 Qt5介绍

1.2.1 Qt Quick

​Qt Quick是Qt5中用户界面技术的涵盖。Qt Quick自身包含了以下几种技术:
  • QML-使用于用户界面的标识语言
  • JavaScript-动态脚本语言
  • Qt C++-具有高度可移植性的C++库.



类似HTML语言,QML是一个标识语言。它由QtQuick封装在Item {}的元素​的标识组成。它从头设计了用户界面的创建,并且可以让开发人员快速,简单的理解。用户界面可以使用JavaScript代码来提供和加强更多的功能。Qt Quick可以使用你自己本地已有的Qt C++轻松快速的扩展它的能力。简单声明的UI被称作前端,本地部分被称作后端。这样你可以将程序的计算密集部分与来自应用程序用户界面操作部分分开。
在典型的项目中前端开发使用QML/JaveScript,后端代码开发使用Qt C++来完成系统接口和繁重的计算工作。这样就很自然的将设计界面的开发者和功能开发者分开了。后端开发测试使用Qt自有的单元测试框架后,导出给前端开发者使用。

1.2.2 一个用户界面

​让我们来使用QtQuick来创建一个简单的用户界面,展示QML语言某些方面的特性。最后我们将获得一个旋转的风车。
我们开始创建一个空的main.qml文档。所有的QML文件都已.qml作为后缀。作为一个标识语言(类似HTML)一个QML文档需要并且只有一个根元素,在我们的案例中是一个基于background的图像高度与宽度的几何图形元素:


QML不会对根元素设置任何限制,我们使用一个backgournd图像作为资源的图像元素来作为我们的根元素。


注意
每一个元素都有属性,比如一个图像有宽度,高度但是也有一些其它的属性例如资源。图像元素的大小能够自动的从图像大小上得出。否则我们应该设置宽度和高度属性来显示有效的像素。
大多数典型的元素都放置在QtQuick2.0模块中,我们首先应该在第一行作这个重要的声明。
id是这个特殊的属性是可选的,包含了一个标识符,在文档后面的地方可以直接引用。
重要提示:一个id属性无法在它被设置后改变,并且在程序执行期间无法被设置。使用root作为根元素id仅仅是作者的习惯,可以在比较大的QML文档中方便的引用最顶层元素。
风车作为前景元素使用图像的方式放置在我们的用户界面上。


正常情况下你的用户界面应该有不同类型的元素构成,而不是像我们的例子一样只有图像元素。


为了把风车放在中间的位置,我们使用了一个复杂的属性,称之为锚。锚定允许你指定几何对象与父对象或者同级对象之间的位置关系。比如放置我在另一个元素中间(anchors.centerIn:parent).有左边(left),右边(right),顶部(top),底部(bottom),中央(cengerIn),填充(fill),垂直中央(verticalCenter)和水平中央(horizontalCenter)来表示元素之间的关系。确保他们能够匹配,锚定一个对象的左侧顶部的一个元素这样的做法是没有意义的。所以我们设置风车在父对象background的中央。
注意
有时你需要进行一些微小的调整。使用anchors.horizontalCenterOffset或者anchors.verticalCenterOffset可以帮你实现这个功能。类似的调整属性也可以用于其他所有的锚。查阅Qt的帮助文档可以知道完整的锚属性列表。
注意
将一个图像作为根矩形元素的子元素放置展示了一种声明式语言的重要概念。你描述了用户界面的层和分组的顺序,最顶部的一层(根矩形框)先绘制,然后子层按照包含它的元素局部坐标绘制在包含它的元素上。

为了让我们的展示更加有趣一点,我们应该让程序有一些交互功能。当用户点击场景上某个位置时,让我们的风车转动起来。
我们使用mouseArea元素,并且让它与我们的根元素大小一样。


当用户点击覆盖区域时,鼠标区域会发出一个信号。你可以重写onClicked函数来链接这个信号。在这个案例中引用了风车的图像并且让他旋转增加90度。
注意
对于每个工作的信号,命名方式都是on + SignalName的标题。当属性的值发生改变时也会发出一个信号。它们的命名方式是:on + PropertyName + Chagned。
如果一个宽度(width)属性改变了,你可以使用onWidthChanged: print(width)来得到这个监控这个新的宽度值。

现在风车将会旋转,但是还不够流畅。风车的旋转角度属性被直接改变了。我们应该怎样让90度的旋转可以持续一段时间呢。现在是动画效果发挥作用的时候了。一个动画定义了一个属性的在一段时间内的变化过程。为了实现这个效果,我们使用一个动画类型叫做属性行为。这个行为指定了一个动画来定义属性的每一次改变并赋值给属性。每次属性改变,动画都会运行。这是QML中声明动画的几种方式中的一种方式。


现在每当风车旋转角度发生改变时都会使用NumberAnimation来实现250毫秒的旋转动画效果。每一次90度的转变都需要花费250ms。
现在风车看起来好多了,我希望以上这些能够让你能够对Qt Quick编程有一些了解。

1.3 Qt构件

Qt5是由大量的模块组成的。一个模块通常情况下是一个库,提供给开发者使用。一些模块是强制性用来支持Qt平台的,它们分成一组叫做Qt基础模块。许多模块是可选的,它们分成一组叫做Qt附加模块,预计大多数得到开发人员将不会使用它们,但是最好知道它们可以对一些通用的问题提供非常有价值的解决方案。

1.3.1 Qt模块

Qt基础模块是对Qt一台的必要支持。它们使用Qt Quick 2开发Qt 5应用程序的基础。

核心基础模块

以下这些是启动QML程序最小的模块集合。

模块名描述Qt Core核心的非图形类,供其它模块使用。Qt GUI 图形用户界面(GUI)组件的基类,包括OpenGL。Qt Multimedia音频,视频,电台,摄像头的功能类。Qt Network 简化方便的网络编程的类。Qt QMLQML类与JavaScript语言的支持。Qt Quick可高度动态构建的自定义应用程序用户界面框架。Qt SQL  集成SQL数据库类。Qt TestQt应用程序与库的单元测试类。Qt WebKit集成WebKit2的基础实现并且提供了新的QML应用程序接口。在附件模块中查看Qt WebKit Widgets可以获取更多的信息。Qt WebKit WidgetsWidgets 来自Qt4中集成WebKit1的窗口基础类。Qt Widgets扩展Qt GUI模块的C++窗口类。


Qt附加模块

除了必不可少的基础模块,Qt提供了附加模块供软件开发者使用,这部分不一定包含在发布的版本中。以下简短的列出了一些可用的附加模块列表。
  • Qt 3D - 一组使3D编程更加方便的应用程序接口和声明。
  • Qt Bluetooth - 在多平台上使用无线蓝牙技术的C++和QML应用程序接口。
  • Qt Contacts - 提供访问联系人与联系人数据库的C++和QML应用程序接口。
  • Qt Location - 提供了定位,地图,导航和位置搜索的C++与QML接口。使用NMEA在后端进行定位。(NMEA缩写,同时也是数据传输标准工业协会,在这里,实际上应为NMEA 0183。它是一套定义接收机输出的标准信息,有几种不同的格式,每种都是独立相关的ASCII格式,逗点隔开数据流,数据流长度从30-100字符不等,通常以每秒间隔选择输出,最常用的格式为"GGA",它包含了定位时间,纬度,经度,高度,定位所用的卫星数,DOP值,差分状态和校正时段等,其他的有速度,跟踪,日期等。NMEA实际上已成为所有的GPS接收机和最通用的数据输出格式,同时它也被用于与GPS接收机接口的大多数的软件包里。)
  • Qt Organizer - 提供了组织事件(任务清单,事件等等)的C++和QML应用程序接口。
  • Qt Publish and SubScribe - Qt发布与订阅
  • Qt Sensors - 访问传感器的QML与C++接口。
  • Qt Service Framework - 允许应用程序读取,操纵和订阅来改变通知信息。
  • Qt System Info - 发布系统相关的信息和功能。
  • Qt Versit - 支持电子名片与日历数据格式(iCalendar)。(iCalendar是“日历数据交换”的标准(RFC 2445)。 此标准有时指的是“iCal”,即苹果公司的出品的一款同名日历软件,这个软件也是此标准的一种实现方式。)
  • Qt Wayland - 只用于Linux系统。包含了Qt合成器应用程序接口(server),和Wayland平台插件(clients)。
  • Qt Feedback - 反馈用户的触摸和声音操作。
  • Qt JSON DB - 对于Qt的一个不使用SQL对象存储。
注意
这些模块一部分还没有发布,这依赖于有多少贡献者,并且它们能够获得更好的测试。

1.3.2 支持的平台

Qt支持各种不同的平台。大多数主流的桌面与嵌入式平台都能够支持。通过Qt应用程序抽象,现在可以更容易的将Qt移植到你自己的平台上。在一个平台上测试Qt5是非常花费时间的。选择测试的平台子集可以参考qt-project构件的平台设置。这些平台需要完全通过系统的测试才能确保最好的质量。友情提醒:任何代码都可能会有Bug的。

1.4 Qt项目

来自qt-project百科:
Qt-Project是由Qt社区上对Qt感兴趣的人达成共识的地方。任何人都可以在社区上分享它感兴趣的东西,参与它的开发,并且向Qt的开发做出贡献。
Qt-Project是一个为Qt未来开发开源部分的组织。它基于使用者的贡献。最大的贡献者是DIGIA,它可以提供Qt的商业授权。
Qt对于公司分为开源方向和商业方向。商业方向的公司不需要遵守开源协议。没有商业方向的许可的公司不能使用Qt,并且它也不允许DIGIA向Qt项目贡献太多的代码。
在全球有很多公司,他们在不同的平台上使用Qt开发产品,提供咨询。同样也有很多开源项目和开源开发者,它们使用Qt作为它们的开发库。成为这样开发活泼的社区的一部分,并且使用这个很棒的工具盒库让人感觉很好。它能让你成为一个更好的人吗?也许:-)。
0 0