作者:蔡志明,卢传富,等
出版社:电子工业出版社
格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT
精通Qt4编程(第2版)试读:
前言
本书第1版出版已近三年了,其间Qt也发生了较大的变化。最重要的就是Trolltech公司被Nokia收购,由此改变了Qt发展的趋势。Qt走向了更为开放,功能更丰富,支持的平台更多的道路。
Qt新特点
归纳起来有以下几点:
1.支持LGPL(GNU Lesser General Public License)协议。
我们知道,当一个自由软件使用GPL声明时,该软件的使用者有权重新发布、修改该软件,并得到该软件的源代码;但只要使用者在其程序中使用了该自由软件,或者是使用修改后的软件,那么使用者的程序也必须公布其源代码,同时允许别人发布、修改。也就是说,使用GPL声明下的自由软件开发出来的新软件也一定是自由软件。LGPL是GPL的变种,与 GPL的最大不同是,可以私有使用LGPL授权的自由软件,开发出来的新软件可以是私有的而不需要是自由软件。Qt支持LGPL协议后,用户使用开源版Qt获得了更大的自由度。
2.开放了Qt源代码库,并鼓励社区参与。
以前Qt虽是开源代码,但源码库并未开放,现在在http://qt.gitorious.org/可以自由地访问Qt源码库,并可以为Qt做出自己的贡献。Qt的源码库使用分布式版本控制系统Git管理,也可以通过浏览器浏览。这里有Qt,Qt Creator,Qt Jambi等多个项目等着您的参与!开放源代码库,拉近了Qt开发者与用户之间的距离。
3.彻底开放了原来商业平台的代码。
原来只能在商业版中使用的ActiveQt,Oracle数据库驱动等,现在都能在开源版中使用。开源版和商业版不再是两个源码不同的版本,只是遵守的协议不同而已。开源版用户终于能享受全功能Qt了。同时在Windows平台上也开放了Visual Studio插件和相应支持,开源版用户在Windows上除使用MinGW开发外又多了一项选择,使用Visual Studio开发Qt应用。
4.对嵌入式平台支持力度加大。
Qt除了继续支持嵌入式Linux平台外,增加了对Windows CE,Symbian,Maemo 5等嵌入式平台的支持。与此同时,推出了Qt Mobility软件包,对手机上的GPS设备、多媒体、短信、电话等功能提供了较完善的支持,让用户开发手机应用更为便利。同时Qt还对实时操作系统VxWorks和QNX提供了社区支持,为平淡无奇的嵌入式图形系统打了一剂强心针。
5.最后就是不断添加到Qt软件包中的功能,并行计算框架、动画框架、状态机框架、多媒体框架等几个框架为Qt增色不少。
浏览器、XQuery、XPATH、XSLT、多点触摸、图形效果支持提升了Qt的能力。当然还有其他功能和性能改进不能一一列出,这都使得Qt 4走向了成熟。Qt 4.7中更是引入了类似于Windows ZAML的声明式UI编程的功能,该功能命名为Qt Quick。
总之,在几年前,我们还需要向周围的人介绍什么是Qt,如今只需要对如何更好地应用Qt进行交流。在国内图书市场上,也出现了为数不少Qt相关的书籍。为了与时俱进,本书也根据新版的Qt 4.7 进行了修改,推出了第2版,但本版中不包括Qt Quick编程介绍。
本书的结构
本书共25章,每章讨论一个专题。章节安排上基本采用循序渐进、由浅到深的原则。但最后的高级篇中的章节没有很强的关联,可以按照随意的顺序阅读。每章内容及作者分述如下:续表
如何获取源代码
由于Qt是跨平台的,因此书中的内容应用能够在Windows、Linux、UNIX和Mac OS上运行,书中的程序可能在下列平台之一上编写:Windows XP/Vista、Linux(OpenSuSE、Fedora Core等)。因此书中的屏幕截图可能来源于其中的任何一种操作系统。
要获取本书的源代码,可以访问博文视点资讯有限公司网站获取:
http://www.broadview.com.cn。
致谢
与电子工业出版社孙学瑛编辑是第二次合作了,孙编辑对本书的关心和认真细致的工作,使本书能够及时出版,再次表示诚挚的谢意。
问题反馈
欢迎广大读者和专家对本书提出建议和批评。如果您认为书有错误或对我们有什么建议,可以联系jsj@phei.com.cn。
蔡志明 卢传富 李立夏
2010年9月30日于武汉初级篇第1章 Qt初步实践
作为Qt程序开发之旅的第一站,本章将阐述如何使用Qt开发一个简单的GUI用户界面程序。在这一章,将学习如何建立Qt主程序、建立qmake工程,还将接触到“信号(signal)”和“槽(slot)”以及“Qt布局”等基本概念。随着学习的不断深入,将在第3章和第5章对这些概念进行深入的讲解,并演示它们在GUI用户界面设计中的应用。1.1 第一个Qt程序
在这一节,学习创建第一个较简单的Qt应用程序。在这个程序中,用户界面将显示一行中文“同一个世界,同一个梦想!”通过这个程序,将学会使用两种手段建立Qt应用程序:KDevelop集成开发环境和vim编辑器。1.1.1 建立主程序
首先,看一下第一个Qt GUI应用程序hello的源代码,其内容如下所示(为了便于读者查阅相关源代码,代码的第一行注释了该文件在源代码中的路径)。
这个程序的功能是在一个窗口中显示“同一个世界,同一个梦想!”,运行效果如图1-1所示。图1-1 第一个Qt程序
注意
窗口(Window)和窗口部件(Widget)
本书中,多次使用了窗口和窗口部件的概念。把一个图形用户界面称为窗口,它往往具有标题栏、窗口边框(frame)、能够通过鼠标拖动和改变大小等特性,最典型的窗口就是对话框。例如,第一个Qt应用程序的用户界面就是一个窗口。当文中使用窗口的时候,就是特指这种情况。
一般的,窗口部件是对所有图形用户界面的统称,它既可以作为单独的窗口出现,也可以出现在一个窗口的内部。1.1.2 建立工程
现在暂不分析第一个Qt应用程序是如何运行的,而是先为它建立qmake工程,然后进行调试和运行。
在Linux系统中,可以有多种方法输入、编辑上述Qt程序,此处将使用vim文本编辑器和KDevelop工具建立上述主程序。
1.在vim中建立Qt应用程序
在vim中建立Qt应用程序,步骤如下(如果读者觉得在vim文本编辑器中编辑、调试以及运行Qt应用程序比较麻烦,可以直接跳过这一部分,而选择在KDevelop集成开发环境中建立该Qt应用程序):
打开控制台程序konsole,将当前目录切换到相应的路径下,执行控制台命令“mkdir hello”建立hello目录,执行“cd hello”命令进入该目录。
在控制台执行“vim hello.cpp”命令(如果文件hello.cpp已经存在,则打开文件;否则新建hello.cpp文件),打开vim文本编辑器。
进入vim编辑器后按“i”键(即打开vim编辑器的修改编辑功能),然后输入第一个Qt应用程序hello的源代码。
按Esc键,退出vim文本编辑器的编辑功能。
最后,在vim文本编辑器的命令行输入命令“:wq”,按回车键后vim将保存文件并退出。
现在,第一个Qt应用程序hello已经输入到vim文本编辑器中了。关于vim编辑器的使用读者可查阅相关帮助文档,在此不再赘述。
2.在KDevelop中建立Qt应用程序
KDevelop是集编辑、编译、调试和运行C++程序等诸工具于一身的应用程序集成开发环境。在KDevelop中建立Qt应用程序并进行编译、调试、运行都是比较简单的,但需要建立KDevelop工程(这和使用VC++进行应用程序开发是类似的),对于初学者来说过程有些复杂。具体步骤如下:
打开KDevelop后,选择菜单“工程”|“新建工程”,如图1-2所示。
在“建立新工程”对话框的“所有工程”选项卡中,选择“C++|QMake project|Basic Qt 4 Application”,选择或者输入存放位置(例如,“/home/lcf/book/chapter01”),输入应用程序名称“hello”(KDevelop将会在/home/lcf/book/chapter01/路径下建立hello目录),单击“下一步”按钮,如图1-3所示。
设置“工程选项”,在此输入Qt 4的qmake和Qt设计器的绝对路径,直接单击“下一步”按钮,如图1-4所示。
设置“版本控制系统”,略过,单击“下一步”按钮,如图1-5所示。图1-2 新建KDevelop工程图1-3 建立hello工程图1-4 设置工程选项图1-5 设置版本控制
在“h文件的模板”选项(如图1-6所示)中,可以设置头文件.h的格式(在此省略);单击“下一步”按钮进入“cpp文件的模板”选项卡(如图1-7所示),与“h文件的模板”类似。
最后,单击“完成”按钮,KDevelop会自动生成一个标准的C++主程序。在此,编辑修改为第一个Qt应用程序hello的源代码,如图1-8所示。图1-6 设置头文件模板图1-7 设置实现文件模板图1-8 第一个KDevelop工程
到此,在KDevelop中已经建立了一个KDevelop工程,并且输入了第一个Qt应用程序hello。接下来,建立Qt应用程序的qmake工程文件。
有两种方法建立qmake工程:自动生成和手动建立。下面分别描述如何使用这两种方法建立应用程序hello的qmake工程。
3.自动建立qmake工程
对于比较简单的小应用程序,使用qmake命令自动建立的qmake工程完全可以满足需要。
前面,已经在vim文本编辑器中输入了第一个Qt应用程序hello的源代码,现在为它建立相应的qmake工程。
首先,在控制台konsole中将当前目录切换到hello.cpp文件所在的目录,运行“qmake –project”命令。此时Qt的qmake工具将在当前目录下自动生成应用程序hello的工程文件hello.pro,其内容如下。
下面分析一下这个qmake工程文件。
前3行文本是qmake工具自动添加的注释文本,它描述了该qmake工程文件是由qmake工具自动生成的,以及文件生成的时间和qmake工具的版本号。
变量TEMPLATE描述了为建立目标文件而采用何种模板,即生成何种形式的Makefile文件。qmake工具定义了5种模板:
● 应用程序app,为建立一个Qt应用程序创建Makefile文件;
● 库lib,为建立应用程序库而创建Makefile文件;
● 子工程 subdirs,为建立子目录下的目标文件创建一个 Makefile 文件,子目录通过变量SUBDIRS指定(子目录下的工程文件也需要指出使用何种模板);
● VC应用程序vcapp,为Visual Studio生成一个应用程序工程,仅仅用于Windows操作系统。
● VC库vclib,为Visual Studio生成一个应用程序库工程,仅仅用于Windows操作系统。
由于第一个Qt程序是一个可直接执行的应用程序,因此采用“应用程序app”模板。
变量TARGET描述了目标文件的名称,即生成的应用程序的名字。qmake工具自动生成的qmake工程文件采用默认方式(TARGET的值为空),即应用程序的名字采用工程文件hello.pro所在的文件夹的名字hello。
变量DEPENDPATH描述了建立应用程序所依赖的其他文件所在的路径。hello.pro工程文件中将该值设置为当前目录。
变量INCLUDEPATH描述了编译该工程时编译器需要搜索的#include路径。hello.pro工程文件中将该值设置为当前目录。
变量SOURCES选项告诉编译器,源代码文件的路径(相对于工程文件hello.pro的位置)及其文件名字。应用程序hello比较简单,只包含一个hello.cpp源文件。
现在,在KDevelop中建立qmake工程文件。
事实上,在KDevelop中建立KDevelop工程的时候,KDevelop会在约定的目录下建立了一个与应用程序同名的hello目录,它的主要目录结构如图1-9所示。
其中,
● bin 目录存放可执行的目标文件;
● src目录存放源文件(包括qmake工程文件src.pro以及资源文件等);
● templates目录存放KDevelop生成源文件.cpp和头文件.h时使用的模板;
● hello 目录下的其他文件都是关于 KDevelop 工程的(hello.pro是自动生成的qmake工程文件)。图1-9 第一个Qt程序的目录结构
可以看到,KDevelop在上面的目录结构中生成了两个qmake工程文件:hello目录下的hello.pro主工程文件和hello/src目录下的src.pro子工程文件。
主工程文件hello.pro的内容如下。
第1行的TEMPLATE变量的值为subdirs,表示hello.pro工程在子文件夹中还包含子工程。子工程文件所在的目录由第2行SUBDIRS变量指定。在运行qmake生成Makefile文件的时候,qmake工具会根据主工程hello.pro中的SUBDIRS选项自动到相应的目录下寻找src.pro子工程文件,qmake工具将联合两个工程文件分别生成两个前后相关的Makefile文件。
qmake子工程文件src.pro的内容如下。
该工程文件中,大多数变量(或选项)采用了默认值,仅仅定义了SOURCES和TARGET工程选项,在此不再详述。
注意
工程文件中的源文件.cpp和头文件.h的位置,既可以采用绝对路径表示,也可以采用相对路径表示。相对路径意味着源文件或头文件相对于工程文件.pro所在目录的路径。例如,在第一个Qt应用程序的例子中,src.pro工程文件在./hello/src目录下,hello.cpp源文件也在./hello/src目录下。那么采用相对路径时,工程文件src.pro的选项SOURCES的值为:
./hello.cpp(或 hello.cp)
而采用绝对路径时,则值为:
其他工程选项也是类似的,比如src.pro工程文件中的TARGET变量值为../bin/hello,表示目标文件将被放置在
4.手动建立qmake工程
建立较大型Qt应用程序时,使用qmake工具生成的qmake工程文件将无法满足编程的需要。尽管qmake工具生成的工程文件完全可以满足hello程序的编译需求,但作为一个例子,笔者生成了一个对应于vim输入的源代码文件的较简单的hello.pro文件,它位于hello目录下。其内容如下:
下面,简单地分析一下这个工程文件。
● 变量TARGET定义了可执行目标文件的名字为hello。
● 变量DESTDIR定义了存放可执行目标文件hello的路径,即在hello目录下。
● 变量CONFIG定义了编译选项,即:
debug表示建立的目标代码是调试版本(相对于release发布版本);
warn_on要求编译器在编译应用程序时打开警告开关。
● 变量 OBJECTS_DIR 描述了编译/连接应用程序过程中产生的中间文件存放的位置,即将编译器生成的中间文件hello.o放置在工程文件所在目录的tmp子目录下(hello/tmp)。
在为应用程序hello 建立qmake工程后,就可以编译运行第一个Qt应用程序了。1.1.3 编译/运行第一个Qt应用程序
下面,通过两种方式编译、运行第一个Qt应用程序。
在控制台模式下,依次在工程文件所在的目录下执行下述命令:
● qmake,生成Makefile文件;
● make,编译、连接并生成可执行代码;
●./hello,执行应用程序。
在KDevelop中,编译、运行Qt应用程序的步骤如下:
在右侧“QMake管理器”选项卡的“src”子工程下单击右键,选择菜单命令“运行qmake”,建立Makefile文件,如图1-10所示。
选择“编译”菜单中的“编译工程”命令(或单击工具栏中的“编辑工程”工具按钮),编译、连接Qt程序,如图1-11所示。
选择“编译”菜单中的“执行主程序”命令(或单击工具栏中的“执行主程序”工具按钮),运行hello程序。应用程序的运行效果如图1-12所示。图1-10 KDevelop中运行qmake图1-11 执行编辑工程命令图1-12 第一个Qt程序运行效果1.1.4 第一个Qt程序的代码分析
现在再回过头来逐行地分析一下源代码,看看第一个Qt应用程序是如何运行的。
这是一个非常简单的Qt应用程序,它不包含任何自定义的类,且仅仅有一个hello.cpp主程序文件。
首先包含必要的Qt类的头文件。
●#include
●#include
●#include
扩展阅读
Qt4定义了多个模块,每个模块包含相对独立的库文件并实现各自相应的功能。Qt4的软件开发模块有:
● QtCore,Qt4的基本模块,定义了其他模块使用的Qt 核心的非GUI类,所有其他的模块都依赖于该模块。
● QtGui,定义了图形用户界面类。
● QtMultimedia,提供了对低级多媒体编程的支持。
● QtNetwork,定义了Qt的网络编程类。
● QtOpenGL,定义了OpenGL的支持类。
● QtOpenVG,定义了对OpenVG的支持类。
● QtScript,该模块提供了对脚本的支持。
● QtScriptTools,脚本调试器。
● QtSql,定义了访问数据库的类。
● QtSvg,定义了显示和生成SVG(Scalable Vector Graphics)类。
● QtWebkit,定义了显示和编辑Web内容的类型。
● QtXml,定义了处理XML(eXtensible Markup Language)语言的类。
● QtXmlPatters,为XML和自定义数据模型提供了XQuery和XPath引擎。
● QtDeclarative,声明式UI引擎。
● Phono,多媒体框架。
试读结束[说明:试读内容隐藏了图片]