转载:
译 者 序
Qt是跨平台的应用程序和用户接口(UI)开发框架,由集成开发工具、跨平台类库和集成开发环境(IDE)组成,可轻松实现应用程序的“一次编写,随处编译”。目前,Qt主要由诺基亚的Qt Development Frameworks(Qt开发框架组)负责开发和维护,用户涵盖全球60多个国家的4400多家厂商,如Google、Adobe、IBM、华硕、CNTV、中国移动等,基于Qt的知名应用程序有KDE、KOffice、Skype、Google Earth等。
自2008年6月诺基亚购并奇趣科技后,Qt在嵌入式移动平台上的发展大大提速。Qt 4.6增加了Symbian、Maemo平台的支持,旋即发布的QtMobility开发包可提供各移动支持平台下的联系人、导航、网络连接等API;Qt 4.7引入了快速开发脚本语言QML,为普通开发人员快速开发Qt应用程序提供了可能。而今集成了Qt Creator开发环境的Nokia Qt SDK,加强了基于Qt开发Symbian、Maemo/MeeGo/WinCE应用程序的易用性,进一步为非专业人士投身移动平台应用程序开发降低了门槛。
在翻译本书的过程中,深感国内Qt技术力量的薄弱。在互联网如此发达的今天,除Qt中文论坛(
www.qtcn.org)、CuteQt博客(
www.cuteqt.com)和CSDN的Qt技术社区(qt.csdn.net)等少数网站外,大多处于停滞状态。Qt中文论坛建立于2005年,面向广大初、中级Qt开发人员,是目前最为活跃的Qt综合技术中文讨论区;CuteQt博客紧跟Qt的前沿技术领域和最新的Qt开发平台,由许多一线的Qt资深工程师负责维护和运行;CSDN的Qt技术社区提供了许多权威资料。正是这些技术社区在不遗余力地积极推动着Qt技术在国内的发展。
由本书译者参与的《C++ GUI Qt 4编程》(第二版)是第一本对Qt 4技术进行全面、系统介绍的中文权威译著。Jasmin Blanchette和Mark Summerfield是该书的作者,也是Qt在线帮助文档的创建者和Qt开发人员。在书中,他们用许多示例程序和技术案例全面地介绍了Qt框架,使该书成为官方推荐的唯一一本学习书籍,并作为诺基亚员工的Qt入门培训教材。正是如此,该书中文版自出版以来的两年内,已累计重印6次。
本书是《C++ GUI Qt 4编程》(第二版)出版两年后Mark Summerfield的又一本学习Qt的里程碑级图书。在这本书中,不仅涵盖了《C++ GUI Qt 4编程》(第二版)中部分过于高深和未能包含其中的内容,还有许多针对Qt技术底层细节的探讨,大多还没有在任何书籍中涉及过。因此,本书是近两年和未来一段时间内Qt高级技术的概括和预览,可帮助Qt编程人员切实提高他们使用Qt成就事业的能力。
在本书的翻译和审校过程中,我们坚持使用了“两译三审”的严苛做法,力求保证译稿质量,减少误译和纰漏。对于书中涉及的Qt和计算机技术词汇用语,则尽量与《C++ GUI Qt 4编程》(第二版)一书的译法保持一致,避免读者产生困惑。同时,对于某些技术细节还向不少Qt一线开发工程师和原书作者Mark Summerfield做了求证。同时,结合英文原书的勘误信息,译者已将本书的相关代码更新至2011年3月。
本书的翻译和审校工作具体分工是:Qt中文论坛管理员白建平(XChinux)负责本书的第3章、第4章、第5章和第6章翻译工作;西南科技大学的王军锋负责第1章、第2章、第9章和第10章的翻译;CuteQt博客管理员Shiroki负责第11章和第12章的翻译;西北农林科技大学的闫锋欣负责第7章、第8章、第13章以及书中剩余的前言、简介、精选参考书目和结束语等部分的翻译和质量控制工作。解放军装甲兵工程学院的吴迪(wd007)、高波和山东理工大学的戚彬负责了全书的终审和统稿。此外,我们还邀请了西安欧亚学院的周莉娜、赵延兵和韩二伟作为本书的外部审稿人。参与本书文字校对工作的还有朱加平、齐亮、王宁、赵拓和范文等人。
感谢电子工业出版社的编辑。他们对于计算机当前技术趋势的把握和战略眼光,为Qt系列图书的选题引进提供了许多方便,为译者提供了充足的工作时间,使译稿质量得到了最大限度的保证。正是他们对于图书选题的理解,才能为大家的Qt学习之路提供如此多的选择。
书中所用到的示例程序的源代码可从原书站点
www.qtrac.eu/(英文)下载,也可直接从
www.qtcn.org/advqt(中文)下载。
由于本版书中概念和术语数目繁多,并且许多概念和术语目前尚无公认的中文译法,加之译者水平所限,时间仓促,译稿中难免存在曲解或误解作者原意的地方,恳请读者谅解。读者也可以登录
www.qtcn.org/advqt参与讨论,我们也会在此及时更新本书的勘误信息。
译 者
2010年10月
序 言
回想起1991年,我与Haavard Nord一起坐在挪威特隆赫姆公园中的长椅上。在我和Haavard Nord完成非服兵役服务的那段时间内,我俩一起为当地的一家医院开发一个超声波图像的存储和分析软件。这家医院使用了各种类型的计算机,因此,医院希望这个软件系统可以在UNIX、Mac和Windows平台上工作。这是一个巨大的挑战,我们调查市场,希望可以找到一些可以使用的类库。但对于找到的那些类库的质量,令我们担心不已。就在公园的那个长椅上,我们决定迎接这个挑战,提出我们自己的解决方案。
那个时候,我们都年轻、充满斗志且有些天真。讨厌浪费时间查找如何使用那些非直觉型的工具和库,我们决定改进这些工具和库。希望能稍微改善一下世界曾有的软件开发工作。我们的目标就是要让软件开发人员的生活变得更轻松些。众所周知,要实现这一目标,就要专注于软件开发中有趣的那一面,要富有创造性、编写出良好的代码。这样,我们就创造了第一个简单的Qt版本,并在数年后组建了Trolltech(奇趣)公司。
至少,我们完成了一部分既定目标。自从1995年第一次发行Qt以来,它已取得了巨大的成功。
2008年,Nokia收购了Trolltech,2009年4月,对我而言,是时候要继续前进了。在公司里度过了15年又27天后,我不再是其中的一员了。
产品在优秀的人手中,团队的激情和繁重的工作一如既往。在Nokia的奇趣科技(Trolltech)依旧在努力确保Qt成为一流的、众望所归的框架。Lars Knoll(kHTML、鼎鼎大名的WebKit的鼻祖)今天正率领着近150名Qt专业工程师。作为授权协议的选择,Nokia还新增了LGPL授权,这使Qt可被更多的开发人员所使用。
2009年秋,我以荣誉嘉宾的身份受Nokia之邀参加了德国慕尼黑的Qt开发人员日(Qt Developer Days)活动。这个用户参与的会议(也在美国举办)是Qt爱好者的盛会,其规模正在逐年扩大。能够倾听来自全欧洲Qt用户间的探讨声,是一种很棒的感觉。我与许多开发人员进行了交流,他们都告诉我,在他们的软件开发工作中,Qt的确与众不同。这让身为程序员的我感觉良好。
Qt作为一个很棒的工具和类库,这仅仅是它取得成功的部分原因。用户还需要良好的文档、一些教程和书籍。毕竟,让开发人员生活更轻松才是目标。
这是我所深信不疑的,回溯到2003年也是如此。当时,我是Trolltech的总裁,负责文档的Mark Summerfield走进了我的办公室。他希望和Jasmin Blanchette一起写一本关于Qt的书。一部非常好的书,要由一个对产品知识无限熟悉且能够清晰、直观说明事物的人来撰写。当时,还有谁能够比Qt的文档负责人、同时也是最好的Qt开发人员的人,更适合这项工作呢?
最终的结果就诞生了一部关于Qt的伟大图书,并随后进行了更新和扩展。
Mark现在又完成了另一项重要的工程。
在Qt编程人员的武器库中,就差一部有关Qt高级编程的书籍。我非常高兴,Mark已经写完了这样的一部书。他是一名非常好的撰写技术书籍的作家,拥有撰写Qt编程书籍所应具有的全部背景知识,是最具权威的人选。他专注于细节和清晰直观表达自己的能力总是令我印象深刻。也就是说, 您一定会满意的!
在您手中(或通过屏幕阅读),您正紧握着一次扩充自己知识的极好机会,它可以让你用Qt做出许多超酷的东西。
编程快乐!
Eirik ChambeEng
于法国,南阿尔卑斯山
2009年12月24日
前 言
一段时间以来,我一直想写一本Qt书籍,一本能够涵盖《C++ GUI Qt 4编程》一书中过于高深内容的书籍,尽管对一些读者来说,该书本身已经够有挑战性了。还有一些我打算涉及的专题材料(并非是比较难的)而是它们并没能包含进第一本关于Qt编程的书中。此外,从Qt庞大的规模上来看,也没有哪一本书能够对Qt所有的内容进行毫无偏颇的描述。毫无疑问,这为新技术文稿的撰写留下了空间。
这本书所做的就是从许多模块和各个方面的类中选择了一些内容,并展示该如何使用它们。这些所选择的主题都是我自己感兴趣的,同时好像也正是它们在Qt爱好者邮件群qtinterest中引起了许多讨论。这些主题中的一些主题还没有在任何其他书籍中涉及过,而另外一些主题则较为熟悉,比如,模型/视图编程。无论如何,我将尽量提供比其他可借鉴材料更为全面的内容。
因此,这本书的目的就是帮助Qt编程人员加深和拓宽他们的知识,提高他们使用Qt成就事业的能力。“高级”方面通常更多地是指能做到什么,而不是实现方法的手段。这是因为,正如常说的那样,Qt让我们尽可能远离不相关的细节和潜在的复杂事物,提供易于使用的应用程序接口(API),从而只需简单、直接地使用就可以获得极好的效果。例如,我们将会看到:在不知道任何播放器工作原理的情况下,创建一个音乐播放器的过程;而所需要了解的仅仅是Qt所提供的那些高级API。另一方面,即使对于高级QtConcurrent模块的用法,它所涵盖的对多线程的必要知识也都很有挑战性。
这本书假设读者都具有基本的C++编程能力,并且至少知道如何来创建基本的Qt应用程序——例如,已经读过一部好的Qt 4书籍,并有一定的工程实践经验。本书还认为,读者应该熟悉Qt的参考文档,至少能够使用它查询到感兴趣的类的API。此外,一些章节会假设读者已经知道相关主题的基本知识——例如,第1章会假设读者已经知道一些JavaScript和Web编程的知识,在多线程的那些章节里,作者会假设读者能够理解线程的基本知识和Qt的线程类。所有这些假设都意味着,这本书将能够免于介绍那些Qt程序开发人员已经熟知的许多细节和类,比如布局的使用、动作的创建、信号和槽的连接等,从而可以让本书完全专注于那些读者不是很熟悉的知识。
当然,没有哪部单卷本书籍可以真正毫无偏颇地描述那700多个Qt公共类——在Qt 4.6中, 几乎有800个, 以及100多万字的Qt文档,所以本书也不会试图去那样做。相反,这本书为如何使用Qt最具强大功能的那些特征提供了一些说明和示例,用来补充参考文档而不是对它的重复。
本书在章节设计上,已尽可能做到内容完整,因而也就没有必要按照章节顺序自始至终地进行阅读。为了实现这一点,对于不同章节中要用到的那些特定技术,仅会在一个地方进行说明,而在其他地方则会使用交叉引用的方式给出。即使如此,如果你打算随机阅读一些零星章节,建议至少先对整本书做一个粗略的浏览,因为一些章节会专注于某个特定主题,而它又是其他主题必不可少的材料。同样,我将尽可能多地介绍那些完全来自Qt的API的小细节,以使本书的内容更为丰富,并在上下文中尽可能多地介绍那些特性,因而通篇会出现一些有用的信息。
与我之前那些书一样,本书中引用的代码段都是些“活代码”,也就是说,这些代码都是直接从例子的源文件中自动抽取并直接嵌入到送给出版商的PDF文件中的——因而就不会有剪切、粘贴方面的错误,而且可保证代码能够正常工作。这些例子可以从
www.qtrac.eu/aqpbook.html获得,基于GPL(GNU General Public License,GNU通用公共授权第3版)进行授权。本书将给出多达25个例子,分布在150多个.hpp和.cpp文件中,累计超过20 000行代码。尽管全部最为重要的代码段都在书中进行了引用和解释,但还有大量的细节无法在这本书内进行阐释,因此,建议下载这些示例并至少阅读一下那些你所特别感兴趣的例子的源代码。除了这些例子,本书还提供了一些包含有常用功能的模块。所有这些都用AQP命名空间来确保其重用性,开头的一些章节会将它们引进来,然后会在整本书中一直使用。
所有例子(除了最后一章中用到了Qt 4.6特性的那些例子)都用Qt 4.5和Qt 4.6在Linux、Mac OS X和Windows平台上进行了测试。使用Qt 4.5建立的那些应用程序将可以在Qt 4.6下不做修改而直接运行,对后续的其他Qt 4.x版本也可以运行,因为Qt在各个次要发行版中维持向后兼容。然而,对于这两个Qt版本之间的那些不同之处,本书会说明和解释与Qt 4.6相关的方法,而源代码部分会使用#if QT_VERSION,以便可以用特定的版本或者最好的习惯来编译代码。一些例子或许可用于先前的Qt 4.x版本,特别是Qt 4.4,且一些例子或许可以向后移植(backport)到更早的Qt版本——然而,这本书仅仅完全关注于Qt 4.5和Qt 4.6,所以不会明确涉及到向后移植的问题。
本书给出了最好的Qt 4.6实践,尽管Qt 4.6比Qt 4.5包含更多的新特征,但对代码来说却并没有太多不同。一个细微差别之处在于:Qt 4.6有“退出”(quit)动作的快捷方式而Qt 4.5没有;源代码中,对于Qt 4.6会使用其快捷方式,而对于Qt 4.5,则会用#if QT_VERSION表示与之功能相当的代码。更为重要的不同之处在于,Qt 4.6引入了QGraphicsObject类,而且还在它与几何形状变化通信时改变了那些图形项(graphics item)的行为。我们会在某些地方说明这些不同之处,并在书中的代码段中给出Qt 4.6的方法,但是在源代码中,用#if QT_VERSION来说明如何用Qt 4.6和Qt 4.5及其早期版本来完成同样的事情,并为两者选择最好的方法。在本书的最后一章,作为之前给出例子的转换,用三个例子中的两个来说明与Qt 4.6相关的那些特性,以及对Qt 4.6动画和状态机框架的应用。通过修改之前的例子,就更容易看出如何从传统的Qt方法过渡到新的框架下。
Qt的下一个版本,Qt 4.7将重点关注于稳定性、速度以及除Qt Quick之外的新技术(可提供一种使用类JavaScript语言创建GUI声明的方法),我们希望引入比之前发行版更少的新特性。尽管现在仍然有巨大的精力投入到Qt中,其范围也在不断扩大,但本书应当作为学习和使用Qt 4.x系列方面重要技术的一个有用资源,特别是对Qt 4.5、Qt 4.6和若干年后就要来临的那些后续版本来说。
致谢
我第一个要感谢的是我的朋友Trenton Schulz,Nokia公司Qt开发框架组(Qt Development Frameworks,之前的Trolltech公司)中的一名前任软件工程师,他目前是挪威计算中心(Norwegian Computing Center)的一名研究学者。事实证明,Trenton是一名可靠的、富有远见的和挑战性的审稿人,他阅读仔细、标准严格,他提出的一些建议对改进本书相当有帮助。
接下来要感谢的是另外一位朋友,Jasmin Blanchette,他以前也是Qt开发框架中的一名软件工程师,与我一起合著了C++ GUI Programming with Qt 4本书的中文译名是《C++ GUI Qt 4编程》,已由电子工业出版社于2008年8月出版发行,详情请参阅
http://www.phei.com.cn/bookshop/bookinfo.asp?bookcode=TP070380%20&booktype=main或
www.china-pub.com/42122——译者注。一书,目前正在慕尼黑工业大学攻读博士学位。我们两个在前一段时间对这本书就形成了一致意见,而仅仅是因为工作的压力让他成为了一名出色的而且是苛刻的审稿人,而不是合著者。
我还要感谢很多那些工作(或任职)于Qt开发框架的人,他们阅读了该书的一些部分并提供了有益的反馈信息,还要感谢那些回答了技术问题的人,还有同时做了以上两件事的人。这些人包括:Andreas Aardal Hanssen(对图形/视图那几章给出了特别优秀的反馈和建议,并为我列出了离屏渲染方面的补充材料)、Andy Shaw、Bjrn Erik Nilsen、David Boddie、Henrik Hartz、Kavindra Devi Palaraja、Rainer Schmid(目前在Froglogic)、Simon Hausmann、Thierry Bastian和Volker Hilsheimer。
意大利软件公司(
www.develer.com)是一家很好的一个软件公司,为我提供了免费主机,让我能够在漫长的写作过程中安心完成这本书。他们的一些开发人员给了我有用的反馈,特别是早期章节中的一些例子。我特别感谢Gianni Valdambrini、Giovanni Bajo、Lorenzo Mancini(为我创建了资料库)和Tommaso Massimi。
特别感谢初稿读者Alexey Smirnov,他指出了一些错误,并鼓励我在一些网络示例中加入对网络代理的支持。
我还要感谢Froglogic的创始人,Reginald Stadlbauer和Harri Porten——他们提供给我的兼职顾问的工作, 以帮我找到了写作这本书的时间,也同时向我介绍了一些编程技术,它们对我来说都是一些全新的想法。他们还把我变成了他们的GUI应用程序测试工具——Squish的超级爱好者。
我的朋友Ben Thompson也应得到许多感谢,他帮我回忆起一些已经忘却的、可靠的数学概念,并且尤其要感谢他的耐心,一遍遍地向我解释这些数学概念直到我能够理解为止。
若没有Qt,这本书(以及其他一些书)就不会成为现实。因此,我非常感谢Qt的创始人Eirik ChambeEng和Haavard Nord,尤其要感谢Eirik,他允许我在Trolltech的时候,把撰写我的第一本书作为日常工作,并且他还花费时间和精力来为这本书写了序言。
要特别感谢我的编辑,Debra Williams Cauley,相当独到地建议我优先撰写这本书,并且,她的支持和帮助让工作取得了实质性的进展。还要感谢Jennifer Lindner在书籍的结构和其他反馈方面做出的有效努力。还要感谢Audrey Doyle,她对本书的出版管理工作认真负责,还要感谢审校读者Barbara Wood,做出了那么好的审校工作。
我还要感谢我的妻子Andrea,她与我一起经历了撰写过程中的坎坎坷坷,感谢她不朽的爱和无尽的支持!