译者序 感谢奇趣科技公司(Trolltech,www.trolltech:com)为我们提供了Qt。无论是职业的程序开发人 员,还是编程爱好者,都希望自已编写的应用程序可以流畅地运行于所有平台,而Q在这一方面 的岀众表现令我们印象深刻利用αt提供的C艹应用程序开发框架,可以轻松实现“次编写,随 处编译”的跨平台解决方案,使我们的应用程序能完美运行于从 Windows98到vsta,从 Mac: OSx 到Linx,从Soas、HPX到其他基于X的众多UNX平台之上。屿此同时,作为Qt组成部分之 一的 Qt/Embedded Linux,也为嵌入式系统的开发人员搭建了一套完善的窗口系统和开发平台。 Qt具有功能强大的在线帮助文档系统。利用它,只需轻点鼠标或者简单敲击几下键盘,就可 以轻易制作出简单的“ Hello World”欢迎对话框,或者甚至是更为复杂的电子制表软件系统。这 点,在众多的软件帮助文档系统中并不多见。然而,帮助文档系统毕竞是以为用户提供实用的类 库参考为主要目的的,也就是说,它主要是为用户提供准确的“可以如何做”的信息。这对于喜欢 举一反三的程序设计人员来说,显然远不够,因为我们更喜欢知道“为什么要这么做” 本书围绕如何使用Qt编写图形用户界面程序这一中心,并尽可能多地采用手写代码的方式 生动、全面而又深刻地阐明了Q程序的设计理念。当然,在本书以及上一版本相继出版的几年 中,Q已经由一个简单的图形工具包演变成长为具有事实标准意义的应用程序开发框架。如今, 蓬勃发展的KDE桌面环境和诺基亚公司对奇趣科技公司的收购进一步展示了Q的无限发展潜 力和令人期待的远景。 本书作为“C++ GUI Programming with Qt4"的第二版,在充分讲述Qt4,x新特性的同时,又较好 地延续了第一版的风格。全书仍由四部分构成,第一部分按照循序渐进、由浅人深的原则,介绍了 使用Qt编写图形用户界面应用程序时所需的基本概念,并对这些基础知识安排了对应的实践训 练,使读者仅利用这一部分知识就足以写出实用的图形用户界面应用程序。第二部分进一步深入 介绍了Qt中的一些重要知识,如事件处理、拖放操作、项视图、多线程等。第三部分提供了更为专 业和高级的内容,如三维图形、创建插件和应用程序脚本等。如果您已经较好地掌握了Qt的基础 知识,那么完全可以像使用一本实用参考书一样以任意的顺序阅读第二部分和第三部分中的章节。 第四部分由数个附录构成分别介绍了Q的获取和安装Q应用程序的构建、 Qt Jambi和C++的基础 知识,它们可以帮助您更充分地使用Qo 正如 Prentice hal开源软件开发系列丛书主编之一的 Arnold robbins所说的那样,“这的确是 本好书”。首先,本书是由奇趣科技公司推出的关于Qt的官方书籍,也是该公司新员工的培训教 材。当然,这只能算作一个佐证而已。其次,作者在介绍Q程序设计中的很多关键内容时,不仅 详细阐述了各种基本概念和底层背景知识,而且还对编程实践中的技巧和理论知识做了充分说 明,它们是开发其他程序时可供借鉴的宝贵经验,这也使得本书成为一部很有价值的软件技术 书籍。 在本书的翻译过程中,首先要感谢齐亮所做的巨大贡献。当我们在2006年联系他并且希望 与他合译本书的第一版时,他就慷慨地接受了。几经辗转,当我们终于得到授权可以翻译第二版 (也就是本书)时,他秉持无私的开源精神,无偿奉献了《C++GUπIQt3编程》一书的电子版源文件 以及第一版的部分译稿草稿,从而大大提高了翻译进度。齐亮作为国内Q技术的布道者执著而 无私的开源技术人员(他是KE开源项目的主要成员之一),值得我们每一个人学马 本书翻译工作的具体分工是:西北工业大学的闫锋欣翻译了本书的第1~7、18、21、23章以及 附录A、附录D前言和致谢等部分;曾泉人翻译了第9~17章;奇趣科技公司北京分公司的张志强 工程师翻译了本书的第8、19、20、22、24章以及附录B和附录C。我们还邀请了西安欧亚学院的周 莉娜和赵延兵两位老师作为本书的外部审稿人,他们的细致和耐心,为我们的工作增色不少。此 外,参与本书文字校对工作的还有:西北工业大学的陆达方和丁士鹏先生,西安建筑科技大学的赵 国锋硕士。还要感谢西北工业大学的张延超博士,他完成了本书第一版的审校工作。 为了更充分地使用本书,您除了可以访问原书的站点htp:/w. informit. com/ite/0132354160 外,还可以访问本书的中文站点h4p:/w. gtcn. org/ gpq4。在这些地方,您不仅可以下载到与本书 配套的示例程序还可以与各位专业人士一起讨论Q的相关技术问题。这里要特别说明的是,非 常感谢www.gtcn:org的网站负责人白建平(XChinux)先生,正是他方让本书得以在最为专业的Qt 技术网站上占有一席之地。 由于译者水平有限,加之时间仓促,译稿中难免有曲解或误解作者原意的地方,望读者谅解并 批评指正。同时,如果您有什么好的建议,可以随时在ht:gcn,og/gq4/上以留言的方式告 诉我们。 译者 2008年5月 丛书编者序 亲爱的读者: 作为一名职业程序员,我每天都在使用Q,而且我对Q的组织结构、设计及其为C+程序员 所带来的动力印象深刻。 自Q作为跨平台的图形用户界面工具包诞生以来,它已经扩展到了包括便携式设备在内的 几乎当今程序设计的所有领域,比如文件、进程网络和数据库的存取访问等。由于Q的广泛适 应性及良好的可移植性,只要您编写过一次代码,那么在其他不同的操作系统平台中,只需重新将 其编译一遍即可重复使用。特别是当客户要求您的应用程序能同时运行于不同的平台时,Qt的这 优势就显得格外重要了。 当然,使用开源许可协议也可以获得Q。如果您是一名开源程序开发人员,那么,从Q那里 也将获益无穷 尽管Q提供了大量的在线帮助文档,但这些帮助文档以参考性内容为主。示例程序非常有 用,但仅仅通过阅读这些示例程序就希望能够在自己的程序中正确使用Qt,显然是一件非常困难 的事情。而这一点正是本书引人入胜的地方所在。 这的确是一本好书。首先,这是一本由奇趣科技公司推出的关于Q的官方书籍,这说起来可 能有些多余了。同时,它也是一部巨著:组织巧妙、文笔优雅,并且易于根据该书进行学习。与阐 述伟大技术的巨著相结合,更易于造就真正的成功者,而这也就是为什么让我感到非常自豪和非 常兴奋并乐于将此书作为 Prentice ha开源软件开发系列丛书之一的原因。 我希望您能享受到阅读这本书并从中获益良多的那种乐趣,而我,的确已经体会到了这一点 Amold robbins Nof ayalon,以色列 2007年11月 为什么会是Q?为什么像我这样的程序员会选择Q?这个问题的答案显而易见:Q单一源 程序的兼容性、丰富的特性、C++方面的性能、源代码的可用性、它的文档、高质量的技术支持,以 及在奇趣科技公司那些精美的营销材料中所涉及的其他优势等。这些答案看起来确实都不错,但 是遗漏了最为重要的一点Qt的成功缘于程序员们对它的喜欢 那么,是什么让程序员喜欢某种技术而放弃另外一种呢?就我而言,我认为软件工程师们喜 欢某种技术,是因为他们觉得这种技术是合适的,但是这也会让他们讨厌所有那些他们觉得不合 适的其他技术。除此之外,我们还能解释下面的这些情况吗?例如,一些最出众的程序员需要在 帮助之下才能编写出一个录像机程序,或者又比如,似乎大多数工程师在操作本公司的电话系统 时总会遇到麻烦。我虽然善于记住随机数字和指令的序列,但是如果将其比作用于控制我的应答 系统所需要的条件来说,则可能一条也不具备。在奇趣科技公司,我们的电话系统要求在拨打其 他人的分机号码前,一定要按住“兴”键2秒后才允许开始拨号。如果忘记了这样做而是直接拨打 分机号码,那么就不得不再重新拨一遍全部的号码。为什么是“米”键而不是“#”键、“1”键或者 “5"键?或者为什么不是20个电话键盘中的其他任何一个呢?又为什么是2秒,而不是1秒3秒 或者15秒呢?问题到底出在哪里?我发现电话很气人,所以我尽可能不去使用它。没有人喜欢 总是去做一些不得不做的随机事情,特别是当这些随机事情显然只出现在同样随机的情况下的时 候,真希望自己从来都没有听到过它。 编程很像我们正在使用的电话系统,并且要比它还糟糕。而这正是Qt所要解决的问题。 Qt与众不同。一方面,叶t很有意义;另一方面,Qt颇具趣味性。Qt可以让您把精力集中在您的任 务上。当Qt的首席体系结构设计师面对一个问题的时候,他们不是寻求一个好的快速的或者最 简便的解决方案,而是在寻求一个恰当的解决方案,然后将其记录在案。应当承认,他们犯下了 些错误,并且还要承认的是,他们的一些设计决策没有通过时间的检验,但是他们确实做出了很 多正确的设计,并且那些错误的设计应当而且也是能够进行改正的。看一看最初设计用于构 建 Windows%5和 UNIX Motif之间的桥梁系统,到后来演变为跨越 Windows vista、 Mac Os x和 GNU/Iinw以及那些诸如移动电话等小型设备在内的统一的现代桌面系统,这些事实就足以证明 这一点。 早在Q大受欢迎并且被广泛使用很久以前,正是Q的开发人员为寻求恰当的解决方案所做 出的贡献才使Q变得与众不同。其贡献之大,至今仍然影响着每一个对Q进行开发和维护的人。 对我们而言,研发Q是一种使命和殊荣。能够使您的职业生涯和开源生活变得更为轻松和更加 有趣,这让我们倍感自豪 人们乐于使用Q的诸多原因之一是它的在线帮助文档,但是该帮助文档的主要目的是集中 介绍个别的类,而很少讲述应当如何构建现实世界中那些复杂的应用程序。这本好书填补了这一 缺憾,它展示了Q所提供的东西,如何使用“Q的方式进行Q编程,以及如何充分地利用Qt。本 书将指导C++、Java或者C#程序员进行Q编程,并且提供了丰富详实的资料来使他们成长为老 练的Q程序员。这本书包含了很多很好的例子建议和说明—并且,该书也是我们对那些新加 入公司的程序员们进行培训的入门教材。 如今,已有大量的商业或者免费的q应用程序可以购买或者下载,其中的一些专门用于特殊 的高端市场,其他一些则面向大众市场。看到如此多的应用程序都是基于Q构建而成的,这使我 们充满了自豪感,并且还激励我们要让O变得更好。相信在这本书的帮助下,将会前所未有地出 现更多的质量更高的Q应用程序。 Matthias Ettrich 源 德国,柏林 以 2007年11月 但 喜 在 究 序 Qt使用“一次编写,随处编译”的方式为开发跨平台的图形用户界面应用程序提供了一个完整 的C++应用程序开发框架。Q允许程序开发人员使用应用程序的单一源码树来构建可以运行在 不同平台下的应用程序的不同版本;这些平台包括从 Windows98到sta、 Mac os X Linux、 Solaris HPUX以及其他很多基于X11的UNX。许多Qt库和工具也都是Q/ Embedded linux的组成部分。 Q/ mbedded linux是一个可以在嵌入式Iimx上提供窗口系统的产品。 本书的目标就教您如何使用Qt4来编写图形用户界面程序。本书从“ Hello Q”开始,然后 很快地转移到更高级的话题中,如自定义窗口部件的创建和拖放功能的提供等。通过本书的互联 网站点(htp:/w. informit. com/tte0132354160),您可以下载到一些作为本书文字补充材料的 示例程序。附录A说明了如何下载和安装这些软件;其中包括一个用于 Windows的C++免费编 译器。 本书分为四部分。第一部分涵盖了在使用Qt编写图形用户界面应用程序时所必需的全部基 本概念和练习。仅掌握这一部分中所蕴含的知识就足以写出实用的图形用户界面应用程序。第 二部分进一步深入介绍了Qt的一些重要主题第三部分则提供了更为专业和高级的材料。您可 以按任意顺序阅读第二部分和第三部分中的章节,但这是建立在您对第一部分中的内容非常熟悉 的基础之上的。第四部分包括数个附录,附录B说明了如何构建Qt应用程序,附录C则介绍了Qt Jambi,它是Java版的Q。 本书的第一版建立在Q3版本的基础上,尽管已通过全书修订来反映那些很好的Qt4编程技 术,但夲书还是根据¢t4的模型枧图结构、新的插件框架、使用Q/ Embedded linuix进行嵌入式编 程等内容而引入了一些新的章节和一个新的附录。作为第二版,本书充分利用了Q242和Q43 中引入的新特性对其进行了彻底更新,并包含“自定义外观”和“应用程序脚本”两个新的章以及两 个新的附录。原有的“图形”一章已经拆分为“二维”和“三维”两章,在它们中间,涵盖了新的图形 视图类和 QPainter的 OpenGL后端实现。此外,在数据库、XM和嵌入式编程等几章中,还添加了 许多新内容。 与本书的前两版一样,这一版的重点放在如何进行QL编程的说明和许多真实例子的提供上, 而不是对丰富的Q在线文档的简单拼凑和总结。因为本书纯粹讲授的是Qt4编程中的原理和实 践知识,因而读者能够轻松学会将要出现在Q44Q4.5以及Q4.x等后续版本中的15个Q新 模块。如果您正在使用的C版本恰好是这些后续版本中的一个那么当然要阅读一下参考文档 中的“What' s New in Qt4.x”-章,以便可以对那些可用的新特性有一个总体把握。 在写作本书的时候,是假定您已经具备了C++Java或者C#的基本知识。本书中的例子代 码使用的是C++中的一个子集,从而避免了很多在Qt编程中极少使用的C++特性。在某些不可 避免而必须使用C++高级结构的地方,会在使用时对其做出必要的解释。如果您对Jaa或者C# 已经非常熟悉但是对C+还知之不多甚至一无所知,那么建议您先阅读附录D。附录D提供了对 C++较为充分的介绍,从而能够让您具有使用本书所必备的C++知识。对于C++中的面向对象 编程更为全面的介绍,建议您阅读由P.J. Deitel和H.M. Deitel编著的“C++ How to Program” ( Prentice Hall2),以及由 Stanley b. Lippman、 Josee lajoie和 Barbara e.Moo编著的“C++ Primer ( Addison- Wesley,2005)这两本书。 系Q以其作为一个跨平台框架而著称,但由于Q拥有直观强大的AP(应用程序编程接口),很 司更愿意把Q用于单一平台的软件开发上。 Adobe PhotoShop Album就是用Q编写的面向大 众市场的 Windows应用程序中的一个例子。纵向市场中很多功能完善的软件系统,如三维动画工 具、数字电影处理软件、自动化电路设计系统(用于芯片设计)油气资源勘探、金融服务以及医学 成像等,都可以基于¢t构建而成。如果您正是一名通过Q成功编写 Windows产品来谋求发展的 人,那么只需通过重新编译您的产品,就可以轻松地在 Mac OS X和Iinixx世界中开拓出新的市场。 可以基于多种许可协议获得q的使用权。如果想枃建商业应用程序,那么必须从奇趣科技 公司购买一个Q的商业许可协议。但如果只想构建一些开源程序,那么就可以使用基于GPL的 Q开源版本。KDE和多数开源应用程序都是基于这种模式并使用Q构建起来的。 除了Q的数百个类之外,还有很多扩展Qt应用范围和功能的其他软件。其中的一些产品,像 Qt solutions中的一些组件,都可以从该公司获得。同时,还有其他很多软件由另外些公司或者开 源社区提供。对于可用的Q额外软件的列表清单,可以查阅ht:/w. trolltech. com/products/gt 3 Biparty/。奇趣科技公司的开发人员也有他们自己的网站,这就是 Trolltech实验室( Trolltech. Labs htp: Clabs trolltech:com/),他们会把自己写的一些用于娱乐方面的有趣的或者是有用的非官方代 码放在那里。α还建立了一个维护良好并且內容丰富的用户社区,用户可以通过Qt兴趣邮件列 表来进行交流,详细情况请参阅htp:/ lists: trolltech,com 如果您在本书中发现了任何错误对下一版有任何建议或者想反馈意见,我们将非常高兴收 到您的邮件,邮件请发送到 gt: book@ robotech,com 致谢 首先要感谢 Eirik Chambe-Eng;他是奇趣科技公司的总裁,也是该公司两位创始人之一。Fink 不仅热情地鼓励我们编写了本书的Qt3版本一书,他还允许我们在写作本书时占用大量的工作时 间。Eink和公司的 ceo--Haavard nord,都阅读了本书的初稿并给出了许多宝贵的意见。他们的 慷慨和远见来自于 Matthias Ettrich,他是该公司的首席程序员,他欣然同意我们把编著本书放在工 作的首位,并且给我们提出了很多关于Qt编程良好风格习惯的建议。 在本书的Qt3版中我们邀请了Qt的两位客户 Paul cur和 Klaus Schmidinger,由他们作为我 们的外部审稿人。他们都是专家,非常关注技术细节,他们在初稿中发现了一些小的错误,并 且提出了许多改进的建议。此外,在公司中,除了 Matthias以外, Reginald Stadlbauer也是我们最忠 实的审稿人,他的技术洞察力是无价的,并且他还教会了我们如何在Q中做一些我们甚至认为是 不可能的事情。 对基于Q4的本书,我们继续从Bik、 Haavard和 Matthias他们那里得到了无私的帮助和大力 的支持。 Klaus schmidinger继续给出了颇有价值的反馈意见,并且我们也继续从Qt的客户Paul Foyd对于一些新材料内容的详细审阅中获益。还要感谢 David Garcia garz6n在附录B中关于 SCons的帮助。在公司里,其他的主要审稿人还有 Carlos Manuel duclosVega、 Andreas aardal hans sen、 Henrik hartz、 Martin Jones、 Vivi gliickstad Karlsen、 Trond Kjermasen、 Trenton schulz、 Andy Shaw、 Gunnar Sletta和 pal de vibe 除了以上所提到的几位审稿人之外,我们还得到了一些专家的帮助,他们分别是: Eskil abra hansen blomfeldt( Qt Jambi)、 Frans Englich(XM)、 Harald Fermengel(数据库) Kent hansen(应用程序脚 本) Volker hilsheimer( ActiveX)、 Bradley Hughes(多线程) Lars knoll(二维图形和国际化)、 Anders Larsen(数据库) Sam Magnuson( gmake)、 Marius Bugge Monsen(项视图类) Dimitri Papadopoulos (QUX11)、 Girish ramakrishnan(样式表) Samuel Redal(三维图形)、 Rainer Schmid(网络和XM)、Amit Pal Singh(C+简介)、 Paul olay tvete(自定义窗口部件和嵌入式编程)、 Geir: vattekar( Qt Jambi)和 Thomas Zander(编译系统) 写作本书占用了我们大量的时间。同时,还要对公司的文档以及与处理文档相关的技术支持 团队表示感谢,并且也要对公司的系统管理员们表示感谢,他们让我们的机器始终稳定运行并可 以随时与整个项目的网络保持联系。 在本书的制作方面,感谢Io吐排版系统工具的作者 Jeff Kingston,他连续不断地增强了该工具 的许多功能,并且对我们的许多问题给予了及时的回复。也要感谢 James Cloos所提供的 DejaVu Mono字体的压缩版,该字体是我们使用的 monospaced字体的基础。感谢奇趣科技公司的 Cathrine Boe代表我们处理了合同和法律上的事务。还要感谢 Nathan Clement所做的系列插图,以及 audrey doyle对本书所做的详细校对。最后,感谢我们的编辑 Debra Williams- cauley,既要感谢她的支持,又 要感谢她为我们提供的轻松自在的写作进程。还要感谢 Lara Wysong编辑,它使得本书这么实用。