整,且支持数据库、XML、Multi- Thread、Socket等方面的programming。若以后台角度来说,无论后端是什么数据库,只要透过相同的Interface,不同数据库的Class来实做这个Interface,前端GUI的程序写法完全不用改变,同理,面对不同的OS,理论上只要透过相同的Interface,不同OS的Class各自实做这个Interface,前端GUI的程序也完全不用改变,最后只要靠Compiler将程序compile成各平台的原生程序即可,这样即可保证其执行速度,不用再靠Virtual Machine。但很可惜这个理想,这么多年来都没人可以做出来,或许是我孤陋寡闻吧。Qt无疑是GUI终极解决方案,有强力的ANSI C/C++语言背书,又有单一的GUI Library,且精简漂亮,又能Compile成各平台的原生执行档,几乎是最完美的解决方案了。 3.5.4 方案的选择
经过以上比较好,考虑到Qt的众多良好特性,尤其是其跨平台性,决定使用Qt开发俄罗斯方块游戏。
3.6 Qt关键技术的介绍
3.6.1 Qt简介
Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面的应用开发框架。 它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象语言,易于扩展,并且允许组件编程。2008年,奇趣科技被诺基亚公司收购,Qt也因此成为诺基亚旗下的编程语言工具。
Qt Creator是一个用于Qt开发跨平台集成开发环境(IDE),Qt Creator可带来两大关键益处:提供首个专为支持跨平台开发而设计的集成开发环境 (IDE),并确保首次接触Qt框架的开发人员能迅速上手和操作。并且它包含了一套用于创建和测试基于Qt应用程序的高效工具,包括: 一个高级的C++代码编辑器、上下文感知帮助系统、可视化调试器、源代码管理、项目和构建管理工具。Qt Creator 2.3.1和 Qt 4.7共同构成的Qt SDK,包含了开发跨平台应用程序所需的全部功能。
Qt支持windows平台、linux/unix平台、macintosh平台、Embedded平台等,所以Qt所开发的应用具有良好地可移植性。
Qt官网(http://qt.nokia.com)上有完整的SDK下载,下载开发平台的SDK,下载完成后点击即可安装。
安装完成后,运行Qt,会出现如图1所示的界面:
图1 Qt界面
3.6.2 Qt功能特性
(1)可移植性 Qt是一个跨平台GUI工具箱,不仅适用于Unix,它同样适用于MSWindows。如果开发平台是MS Windows,可能选择的GUI工具箱为MicrosoftFoundation Classes(MFC),这样就会失去众多的 Unix 用户。相反,如果开发平台是 Unix,可能选择其它工具箱,如Motif等,同样会失去众多的Windows 用户。如果选择的GUI工具箱为Qt,则只要在不同的平台上简单的编译源代码,就可以使原程序在不同的平台上运行,从而解决丢失用户的问题。
Qt把在处理不同窗口系统时的潜在问题隐藏了起来。为使Qt使用方便,Qt包含了一系列类,这些类使开发人员避免了在文件处理、时间处理等方面存在的依赖操作系统方面的细节。
(2)国际化 所谓国际化,通俗的讲,就是指在某国开发的软件可以方便的被其它国家的人使用。Qt为本地化应用提供完全的支持,所有用户界面文本都可以基于消息翻
译表被翻译成各国语言。另外,Qt完全支持双字节16 bit国际字符标准。利用Qt开发跨平台的国际化软件是一个方便、增量的过程。在开发过程中,利用Qt的linguist界面工具就能方便的将开发的软件翻译成各国语言,从而实现软件的国际化。 (3)面向对象 Qt是一个C++工具箱,它由几百个C++类构成。在程序设计中可以使用这些类,如果Qt没有提供真正适合需求的组件,则可以方便的修改现有的组件或者重新编写组件。Qt具有模块设计和注重软件构件或元素的可重用性的特点。一个组件不需要知道它的内容,而通过Qt特有的signal和slot机制与外界通信、交流。
使用Qt进行应用程序的开发,可以充分利用其面向对象和模块化的特征,从繁琐的编程中解脱出来,专注于应用程序本身的实现。
(4)可用户化的外观 Qt支持主题,所以基于Qt的应用软件能在Motif外观、Windows外观,以及另一些用户化的外观之间互换,甚至改变运行时间。这些应用程序不管是在 X Windows下还是在Microsoft Windows下都可以独立操作、运行。
(5)独有的Signal Slot机制 Signal Slot机制是Qt最重要的特征。在MS Windows中,程序通过消息机制和事件循环来实现图形对象行为的触发和处理;在Qt中,程序在一个类中定义多个Signal和Slot,Signal就相当于“事件”,而Slot就相当于响应事件的“方法”。为了实现“事件驱动”,需要将一个类的Signal和另一个类的Slot连接起来(使用connect)。采用这种机制是一种安全可靠的方法,它允许回调。并支持对象之间在彼此不知道对方信息的情况下进行合作,这使Qt非常适合于真正的构件编程。
(6)开发程序的方便性 Qt提供了一个可视化的开发工具Qt Designer,使用该工具就像在Windows中使用Visual C++那样可以直接向项目中添加各种组件,而不需要一步一步地编写代码,这个特点是其它非可视化编程工具望尘莫及的。Qt Designer中包含全面的联机帮助文档,包括超文本方式的Qt Manual,man帮助手册页和补充指南。这些帮助不论是对于初学者还是专业人士,都是非常方便的。
(7)强大的功能 Qt的强大功能主要体现在以下几方面:拥有一套完整的组件,用户可以直接基于这些现成的组件开发出优秀的界面;拥有丰富的API函数,大概有250多个C++类;具有优越的绘画功能和2D/3D图形润色功能,Qt的绘画工具类Qpainter, 可以在任意一个绘画设备上润色图形,对于更高级的2D/3D图形可以结合使用OpenGL和Qt的组件,使用OpenGL就像用任意一个Qt组件一样方便,而且效果比纯粹使用OpenGL作2D/3D图形更好;支持XML。
(8)高性能的工具 Qt是直接基于Xlib的,不依赖其他工具包,所以它的执行效率比一般的基于平台的代码的执行效率要高。
3.6.3 Qt的类库
Qt类库大致可以分为三个部分:控件,框架和工具。
(1)控件 控件部分包括环境控件,主窗口控件,标准对话框, 基本的GUI控件,扩展GUI控件,GUI组织控件,以及帮助系统控件。
环境控件为应用程序提供全局服务的类,包括系统设定、国际化等。例如QTranslator, Qapplication。主窗口类为应用程序提供界面框架,可以在上面添加菜单、工具条等,为应用程序提供集装箱的功能,如QMainWindow。标准对话框类是为打开/关闭文件,选择颜色等预先设计的标准对话框,如QColorDialog, QFileDialog。基本控件包括所有的GUI控件,如按钮、组合框等,如QPushButton。扩展的控件包括树状视图、进度条等, 如QListView。GUI组织类负责对各种控件进行组织以构成复杂的对话框, 如QGroupBox。帮助系统控件是为应用程序提供在线帮助的类,QStatusBar,QToolTip。
(2)框架 框架部分包括的是一些抽象的类,通常不可见,如对象模型、抽象控件、绘图、拖放、控件外观。对象模型是框架的基础,如QObject。可见的控件一般从抽象控件派生,如QButton。绘图类控制绘图, 如QBrush。拖放类控制拖放操作,如QDragObject。控件外观类控制控件的外观如颜色、字体等。例如QColor。
(3)工具 工具部分包括时间日期和链表树等数据结构,它们和GUI无关。普通工具包括链表、堆栈、队列、树等常见数据结构,如QArray。图形处理工具控制图像的编码/解码算法。如QImageIO。I/O控制工具处理I/O的一些类,如QFile。时间和日期工具类处理时间和日期,如Qdate, QTime。另外还有其他杂类如Qsignal, QIconSet等。 3.6.4 Qt对象间通讯机制
对象间通讯是面向对象程序设计的一个极其重要的内容,类似于Microsoft MFC的消息映射和事件循环,Qt的对象间通讯采用的是信号—槽(signal—slot)机制,信号就好像是事件,而槽则是响应事件的方法。如果需要实现对象间的通讯,只需要把一个对象的信号和另外一个对象的槽使用连接(connect)起来[1]。
信号—槽机制说明:
Qt下对象间的通讯用信号—槽机制来实现。信号—槽机制是Qt的一个中心特征并且也是它与其它图形工具包的最不相同的部分。图2直观地表示了这种机制是如何工作的。
图2 信号与槽的连接原理图
在图形用户界面编程中,经常希望一个窗口部件的一个变化被通知给另一个窗口部件。更一般地,希望任何一类对象可以和其它对象进行通讯。例如,如果正在解析一个XML文件,当遇到一个新的标签时,也许要通知列表视图正在用来表达XML文件的结构。较老的工具包是使用一种被称作回调的通讯方式来实现同一目的。回调是指一个函数的指针,所以如果希望一个处理函数通知一些事件,可以把另一个函数(回调)的指针传递给处理函数,处理函数在适当的时候调用回调函数。回调有两个主要缺点:首先他们不是类型安全的,从来都不能确定处理函数使用了正确的参数来调用回调;其次回调和处理函数是非常强有力地联系在一起的,因为处理函数必须知道要调用哪个回调。
在Qt中有一种可以替代回调的技术:使用信号和槽。当一个特定事件发生的时候,一个信号被发射。Qt的窗口部件有很多预定义的信号,但是总是可以通过继承来加入自己定义的信号。槽就是一个可以被调用处理特定信号的函数。Qt的窗口部件有很多