logo资料库

Qt5学习资料.pdf

第1页 / 共158页
第2页 / 共158页
第3页 / 共158页
第4页 / 共158页
第5页 / 共158页
第6页 / 共158页
第7页 / 共158页
第8页 / 共158页
资料共158页,剩余部分请下载后查看
目 录
1 序
2 Qt 简介
3 Hello, world!
4 信号槽
5 自定义信号槽
6 Qt 模块简介
7 MainWindow 简介
8 添加动作
9 资源文件
10 对象模型
11 布局管理器
12 菜单栏、工具栏和状态栏
13 对话框简介
14 对话框数据传递
15 标准对话框 QMessageBox
16 深入 Qt5 信号槽新语法
17 文件对话框
18 事件
19 事件的接受与忽略
20 event()
21 事件过滤器
22 事件总结
23 自定义事件
24 Qt 绘制系统简介
25 画刷和画笔
26 反走样
27 渐变
28 坐标系统
29 绘制设备
30 Graphics View Framework
31 贪吃蛇游戏(1)
32 贪吃蛇游戏(2)
33 贪吃蛇游戏(3)
34 贪吃蛇游戏(4)
35 文件
36 二进制文件读写
37 文本文件读写
38 存储容器
39 遍历容器
40 隐式数据共享
41 model/view 架构
Qt 学习之路 2
----Qt 学习之路 2---- 目 录 1 序 ..................................................................................................................................................1 2 Qt 简介..........................................................................................................................................2 3 Hello, world!..................................................................................................................................3 4 信号槽...........................................................................................................................................9 5 自定义信号槽.............................................................................................................................13 6 Qt 模块简介................................................................................................................................18 7 MainWindow 简介......................................................................................................................22 8 添加动作.....................................................................................................................................25 9 资源文件.....................................................................................................................................30 10 对象模型...................................................................................................................................35 11 布局管理器...............................................................................................................................37 12 菜单栏、工具栏和状态栏.......................................................................................................41 13 对话框简介...............................................................................................................................44 14 对话框数据传递.......................................................................................................................47 15 标准对话框 QMessageBox .....................................................................................................49 16 深入 Qt5 信号槽新语法.........................................................................................................53 17 文件对话框...............................................................................................................................58 18 事件...........................................................................................................................................62 19 事件的接受与忽略...................................................................................................................65 20 event() ........................................................................................................................................69 21 事件过滤器...............................................................................................................................71 22 事件总结...................................................................................................................................74 23 自定义事件...............................................................................................................................78 24 Qt 绘制系统简介......................................................................................................................81 25 画刷和画笔...............................................................................................................................84 26 反走样.......................................................................................................................................89 27 渐变...........................................................................................................................................91 28 坐标系统...................................................................................................................................97
----Qt 学习之路 2---- 29 绘制设备.................................................................................................................................104 30 Graphics View Framework ......................................................................................................107 31 贪吃蛇游戏(1)...................................................................................................................110 32 贪吃蛇游戏(2)...................................................................................................................114 33 贪吃蛇游戏(3)...................................................................................................................120 34 贪吃蛇游戏(4)...................................................................................................................124 35 文件.........................................................................................................................................127 36 二进制文件读写.....................................................................................................................131 37 文本文件读写.........................................................................................................................135 38 存储容器.................................................................................................................................139 39 遍历容器.................................................................................................................................144 40 隐式数据共享.........................................................................................................................151 41 model/view 架构.....................................................................................................................153
----Qt 学习之路 2---- 1 序 51CTO 上面曾经有过这么一个系列,具体是 Qt 的入门教程。当时强调过,那些文章大致是根 据 《C++ GUI Programming with Qt 4, 2nd Editon》编写的。时过境迁,现在回头看看,已经 过去了整整三年。如果你仔细看下那篇系列文章就会发现,发表时间竟然是 2009 年 8 月 20 日;而今天是 2012 年 8 月 20 日。或者是冥冥之中的感觉,竟然选择了同一个时间。 现在,按照年前做过的计划,我会来履行我的承诺,重新修订《Qt 学习之路》。不过,豆子计 划将其取名为《Qt 学习之路 2》,或者就当作是 2.0 版本吧! 从网上的反应来看,这个系列的文章获得了很多读者的认可。时间已经过去三年,Qt 的发展也 有了翻天覆地的变化。如果不受出售事件的影响,Qt 5 即将在 2012 年 9 月发布。而现在, 最新代码库里面已经有了 beta。这意味着,Qt 5 的特性已经确定,不会再有大的改变。所以, 我觉得,我已经可以着手进行一次修订。 本次修订的原则是,结构上大致保持前一版本的顺序不变,包括基本知识的介绍、常用 GUI 组 件的介绍、常用技术的介绍等;内容上将结合 Qt 4 与 Qt 5 两个部分。在可以预见的未来,Qt 4 的程序,无论从旧代码的维护,还是新的程序的出现,都不会立刻退出历史舞台。Qt 5 也并 不像 Qt 4 与 Qt 3 的升级那样的激烈,因此,我觉得有必要同时介绍这两个版本。当然,我并 不确定这种“同时”会不会一直持续到系列的最末,因为也有可能 Qt 5 以一种摧枯拉朽之势,将 Qt 4 扫出历史舞台。这一切尚未可知。鉴于此,豆子才不将本系列命名为《Qt 5 学习之路》, 而是以第二版称呼。 另外,对于上一版本,豆子还是很内疚的。因为并不是一个完整的介绍,Qt 的很多优秀特性, 比如 XML,比如数据库,比如网络,都没有进行介绍。这主要是因为当时接触 Qt 也并不是很 多,很多特性没有使用过,即便抄书写出来,也会觉得心里没底。现在豆子对 Qt 了解更多, 所以,在这次修订中,豆子将竭尽全力将一些用到的特性介绍一下。 至于本系列的定位,豆子主张将其定位于入门教程。不过,如果可能的话,豆子希望能够在其中 穿插一些有关 Qt 实现的相关内容。这部分内容肯定不会是基础的,比如信号槽的实现等。不 过,对于这一点豆子也不敢肯定,毕竟要接触到实现层面上的东西,总要花费一定时间和精力的。 这次修订,没有了《C++ GUI Programming with Qt 4》这本书作为提纲,一切都将按照自己的 思路来。豆子将尽量跟随这本书的顺序,同时希望能够按照 Qt 5 的思路,按照模块来介绍 Qt。 当然,作为修订版,本次修订的着重点在于 Qt 5,Qt 4 的内容将追随 Qt 5 进行介绍。同前文 一样,本系列也会参考《C++ GUI Programming with Qt 4》一书,不过鉴于本书的某些自认为 不合适的组织(比如以一个过大的项目作为示例),本版更多会直接参考 Qt 文档。很多原理 性内容,可能会直接来源于文档,所以,感兴趣的朋友建议直接翻阅文档,以文档原文为准。 - 1 -
说了这么多,总之就是,尽量完成一篇相对高质量的教程。如果有任何建议或者意见,欢迎给豆 子留言。 ----Qt 学习之路 2---- 以此,是为序。 2 Qt 简介 Qt 是一个著名的 C++ 应用程序框架。你并不能说它只是一个 GUI 库,因为 Qt 十分庞大, 并不仅仅是 GUI 组件。使用 Qt,在一定程度上你获得的是一个“一站式”的解决方案:不再需 要研究 STL,不再需要 C++ 的,不再需要到处去找解析 XML、连接数据库、访问网 络的各种第三方库,因为 Qt 自己内置了这些技术。 Qt 是一个跨平台的框架。跨平台 GUI 通常有三种实现策略: 1. 2. 3. API 映射:API 映射是说,界面库使用同一套 API,将其映射到不同的底层平台 上面。大体相当于将不同平台的 API 提取公共部分。比如说,将 Windows 平台上的 按钮控件和 Mac OS 上的按钮组件都取名为 Button。当你使用 Button 时,如果在 Windows 平台上,则编译成按钮控件;如果在 Mac OS 上,则编译成按钮组件。这 么做的好处是,所有组件都是原始平台自有的,外观和原生平台一致;缺点是,编写 库代码的时候需要大量工作用于适配不同平台,并且,只能提取相同部分的 API。比 如 Mac OS 的文本框自带拼写检测,但是 Windows 上面没有,则不能提供该功能。 这种策略的典型代表是 wxWidgets。这也是一个标准的 C++ 库,和 Qt 一样庞大。 它的语法看上去和 MFC 类似,有大量的宏。据说,一个 MFC 程序员可以很容易的 转换到 wxWidgets 上面来。 API 模拟:前面提到,API 映射会“缺失”不同平台的特定功能,而 API 模拟则是 解决这一问题。不同平台的有差异 API,将使用工具库自己的代码用于模拟出来。按 照前面的例子,Mac OS 上的文本框有拼写检测,但是 Windows 的没有。那么,工 具库自己提供一个拼写检测算法,让 Windows 的文本框也有相同的功能。API 模拟 的典型代表是 wine —— 一个 Linux 上面的 Windows 模拟器。它将大部分 Win32 API 在 Linux 上面模拟了出来,让 Linux 可以通过 wine 运行 Windows 程序。由 此可以看出,API 模拟最大优点是,应用程序无需重新编译,即可运行到特定平台上。 另外一个例子是微软提供的 DirectX,这个开发库将屏蔽掉不同显卡硬件所提供的具 体功能。使用这个库,你无需担心硬件之间的差异,如果有的显卡没有提供该种功能, SDK 会使用软件的方式加以实现。(关于举例,可以参考文末一段精彩的讨论。) GUI 模拟:任何平台都提供了图形绘制函数,例如画点、画线、画面等。有些工 具库利用这些基本函数,在不同绘制出自己的组件,这就是 GUI 模拟。GUI 模拟的 工作量无疑是很大的,因为需要使用最基本的绘图函数将所有组件画出来;并且这种 绘制很难保证和原生组件一模一样。但是,这一代价带来的优势是,可以很方便的修 改组件的外观——只要修改组件绘制函数即可。很多跨平台的 GUI 库都是使用的这种 - 2 -
----Qt 学习之路 2---- 策略,例如 gtk+(这是一个 C 语言的图形界面库。使用 C 语言很优雅地实现了面 向对象程序设计。不过,这也同样带来了一个问题——使用大量的类型转换的宏来模 拟多态,并且它的函数名一般都比较长,使用下划线分割单词,看上去和 Linux 如出 一辙。gtk+ 并不是模拟的原生界面,而有它自己的风格,所以有时候就会和操作系 统的界面格格不入。),Swing 以及我们的 Qt。 Qt 和 wxWidgets 一样,也是一个标准的 C++ 库。但是它的语法类似于 Java 的 Swing,十 分清晰,而且使用信号槽(signal/slot)机制,让程序看起来很明白——这也是很多人优先选择 Qt 的一个很重要的原因。不过,所谓“成也萧何,败也萧何”。这种机制虽然很清楚,但是它所带来 的后果是你需要使用 Qt 的 qmake 对程序进行预处理,才能够再使用 make 或者 nmake 进 行正常的编译,并且信号槽的调用要比普通的函数调用慢大约一个数量级(Qt 4 文档中说明该 数据,但 Qt 5 尚未有官方说明)。Qt 的界面也不是原生风格的,尽管 Qt 使用 style 机制十 分巧妙地模拟了原生界面。另外值得一提的是,Qt 不仅仅能够运行在桌面环境中,还可以运行 在嵌入式平台以及手机平台。 Qt 第一版于 1991 年由 Trolltech (奇趣科技)发布。后来在 2008 年,Nokia 斥资 1.5 亿 美元收购 TrollTech,将 Qt 应用于 Symbian 程序开发。2012 年 8 月 9 日,Nokia 将 Qt 以 400 万欧元的价格出售给 Digia。 伴随着 Qt,一直有两种授权协议:商业授权以及开源授权。在 Qt 的早期版本,商业授权包含 一些开源授权不提供的组件,但是在近期版本则不存在这个问题。以往人们对 Qt 的开源授权 多有诟病。早期版本的 Qt 使用与 GPL 不兼容的协议授权,这直接导致了 KDE 与 GNOME 的 战争(由于 Linux 使用 GPL 协议发布,GPL 协议具有传染性,作为 Linux 桌面环境的 KDE 却 是基于与 GPL 不兼容的 Qt 开发,这就不遵守 GPL 协议)。不过,现在 Qt 的开源版本使用 的是 GPLv3 以及 LGPL 协议。这意味着,你可以将 Qt 作为一个库连接到一个闭源软件里面。 可以说,Qt 协议的争议已经不存在了。 3 Hello, world! 想要学习 Qt 开发,首先要搭建 Qt 开发环境。好在现在搭建 Qt 开发环境还是比较简单的。 我们可以到 Qt 官方网站找到最新版本的 Qt。在 Downloads 页面,可以看到有几个版本的 Qt: Qt SDK、Qt Library、Qt Creator 等等。它们分别是:  Qt SDK:包含了 Qt 库以及 Qt 的开发工具(IDE、i18n 等工具),是一套完整 的开发环境。当然,这个的体积也是最大的(Windows 平台大约 1.7G,其它平台大 约 780M)。如果仅仅为开发 Qt,建议选择这一项下载安装。安装方法很简单,同普 通程序没有什么区别。所需注意的是,安装过程中可能能够提供选择是否安装源代码, 是否安装 mingw 编译器(Windows),这个就按照需要进行选择即可。另外值得说 - 3 -
----Qt 学习之路 2----   明的是,Qt SDK 通常比单独的 Qt 库版本要旧一些。比如现在 Qt 正式版是 4.8.2, 但是 Qt SDK 的最新版 1.2.1 中包含的 Qt 是 4.8.1。 Qt Library:仅包含 Qt 库。如果您已经安装了 Qt 开发环境,为了升级一下 SDK 中提供的 Qt 库版本,就可以安装这一个。安装过之后,应该需要在 IDE 中配置安 装路径,以便找到最新版本的 Qt(如果不是覆盖安装的话)。 Qt Creator:基于 Qt 构建的一个轻量级 IDE,现在最新版是 2.5.2,还是比较好 用的,建议使用 Qt Creator 进行开发。当然,如果你已经习惯了 VS2010 这样的工 具,可以在页面最下方找到相应的 Addin。很多朋友希望阅读 Qt 代码以提高自己的 开发水平。当然,Qt 的经典代码是 KDE,不过这个项目不大适合初学者阅读。此时, 我们就可以选择阅读 Qt Creator 的代码,它的代码还是比较清晰的。 当我们安装完成 Qt 开发环境之后,就可以使用 Qt Creator 进行开发。在本系列中,豆子会一 直使用这个 IDE 进行讲解。至于编译器,豆子一般会使用 mingw 或者 gcc。为了编译 Qt 5 的 程序,你应该使用 gcc 4.5 以上的版本,这意味着,如果你是使用 Qt SDK 自带的 mingw,是 不能编译 Qt 5 的程序的(因为这个自带的版本是 4.4),你应该升级 mingw 为 4.5 以上版 本。 至此,我们已经有了 Qt 4 的完整开发环境。如果你想要开发 Qt 5,由于现在(2012 年 8 月) Qt 5 还处于测试阶段,并没有提供二进制库,所以我们需要使用 git 自己获取 Qt 5 的源代码 自己编译(一般需要几个小时时间)。豆子非常不建议在 Windows 上编译 Qt 5,因为可能会 出很多问题。如果你想尝试,可以参考这里。豆子提一句,在 Windows 上编译 Qt 5,需要安 装 perl(并且要安装 GetOpt::Long 模块)、python 和 git,并且需要找到彼此路径。相比而 言,Linux 上面就会简单很多。豆子建议,如果你想在 Windows 上尝试 Qt 5,可以考虑安装 一个虚拟机,使用 Linux 平台;或者自己试着直接在 Windows 本地编译。豆子的环境是使用 openSUSE。openSUSE 的 Qt 5.0 Development Snapshots 已经提供了 Qt 5 二进制版本,免去 了编译的过程。基于此,本文的 Qt 4 版本将在 Windows 平台上使用 mingw 进行测试;Qt 5 版本将在 openSUSE 上使用 gcc 4.6 进行测试。在未来官方推出 Qt 5 Windows 平台的二进制 版本,也不排除在 Windows 上面测试 Qt 5 代码。 在 Qt Creator 中,我们可以在菜单栏的工具-选项-构建和运行的“Qt 版本”和“工具链”这两个选 项卡中配置 Qt Creator 所使用的 Qt 版本和编译器。这或许是最重要的步骤,包括添加新的 Qt 版本以及以后的切换编译器或者 Qt 升级等。 下面尝试开发第一个 Qt 项目:HelloWorld。在 Qt Creator 中新建一个工程: - 4 -
点击这个“新建文件或工程”,在左侧选择项目-Applications,中间选择 Qt Gui 应用,然后点击“选 择…”: ----Qt 学习之路 2---- 在弹出的对话框中填写名称、创建路径等信息: - 5 -
分享到:
收藏