首页 理论教育 智能移动终端平台实验成果

智能移动终端平台实验成果

时间:2023-10-21 理论教育 版权反馈
【摘要】:1995年5月,TrollTech公司公开发布Qt的第一个版本Qt0.90。同年底,发布了Qtopia的第一版,这是用于移动电话和掌上电脑的环境平台。标准C++没有对Qt的元对象系统所需要的动态元信息提供支持。目的是利用这些类,建立或生成不同的功能,用它们来实现Qt的通用化。

智能移动终端平台实验成果

1.实验目的

本实验介绍了Qt应用程序框架。通过实验,使读者初步了解Qt的特点和基本开发流程,并能够编写一个简单的应用程序在仿真器上查看运行效果。

2.实验设备

(1)硬件

● PC1台。

(2)软件

● Nokia Qt SDK。

3.实验原理

Qt是一个跨平台的C++应用程序开发框架。它包括跨平台类库、集成开发工具和跨平台IDE。使用Qt只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。

Qt最初由Haavard Nord和Eirik Chambe-Eng开发而成。1991年,Haavard和Eirik开始一起合作设计、编写Qt的核心类,并且在随后的一年中,Eirik提出了“信号和槽”的设想这一简单有效的强大图形用户界面编程规范。信号和槽机制允许回调,并支持对象之间在彼此不知道对方信息的情况下进行合作,这使Qt非常适合于真正的组件编程。

之所以选择字母“Q”作为类前缀,是因为该字母在Haavard的Emacs字体中看起来非常漂亮,随后添加的字母“t”代表工具包(toolkit)。

1995年5月,TrollTech公司公开发布Qt的第一个版本Qt0.90。从第一天起,Qt就提供了两个版本的软件许可协议:商业许可协议版和自由软件许可协议版。1997年,Matthias Ettrich利用Qt开发KDE的决定,使Qt成为Linux环境下开发C++图形用户界面的事实标准。

2000年,公司发布了Qt/Embedded Linux,用于Linux嵌入式设备。它提供了自己的窗口系统,并且可以作为x11的轻量级替代产品。同年底,发布了Qtopia的第一版,这是用于移动电话和掌上电脑的环境平台。

2005年夏,Qt4.0发布,它大约有500个类和9000多个函数,比以往的任何一个版本都要全面和丰富。如今,Qt已经超越了作为图形用户界面工具包的界限,逐渐成长为一个成熟的应用程序开发框架。

2008年6月,TrollTech公司被Nokia收购。目前,Qt是Nokia的Qt Development Frameworks部门的产品。

Qt支持的平台包括Embedded Linux、Mac OS X、Windows、Linux/X11、WindowsCE/Mobile、Symbian、Meego。使用Qt开发的程序包括KDE、Google Earth、Opera、Skype等。

下面介绍如何使用Qt编写一个应用程序,显示LCD数字,并且可以用滑动滑块的方式来改变数字。首先,介绍程序中涉及的,同时也是Qt中非常重要的Q_OBJECT宏,以及Qt的两个常用模块QtCore和QtGui;然后,结合实验程序讲解Qt中的常用类以及信号与槽的概念;最后,给出使用方面的内容—建立一个完整Qt应用程序的方法。

(1)Q_OBJECT宏

对于所有定义了信号和槽的类,在类定义开始处都必须声明Q_OBJECT宏。一般建议不论是否定义了信号和槽,都在类定义开始处声明Q_OBJECT宏。

Q_OBJECT宏提供了很多的Qt特色。当一个类声明了自己的信号与槽或者使用了元对象系统(Meta-Object System)所提供的其他服务(如文本翻译)时,Q_OBJECT宏必须出现在类定义的私有区。

Q_OBJECT宏声明了在每一个QObject子类中必须实现的一些内省函数:metaObject()、tr()等,Qt的moc工具生成了用于由Q_OBJECT宏声明的所有函数和所有信号的实现。

在程序中的声明如下:

978-7-111-34147-5-Chapter02-46.jpg

Qt的主要成就之一就是使用了元对象机制对C++进行了扩展,并且使用这种机制创建了独立的软件组件。这些组件可以绑定在一起,但任何一个组件对于它所要连接的组件的情况实现都一无所知。标准C++没有对Qt的元对象系统所需要的动态元信息提供支持。Qt通过提供一个独立的moc工具解决了这个问题,moc解析了Q_OBJECT宏的定义并且通过C++函数来提供可供使用的信息。

注意:Q_OBJECT宏只能在QObject的子类中使用。如果不是QObeject的子类,需要元对象系统支持时,可以使用Q_GADGET来代替Q_OBJECT。

(2)Qt常用模块

Qt4提供了一些模块,它们以文件形式被分成了几个类库。最为重要的模块有QtCore、QtGui、QtNetwork、QtOpenGL、QtScript、QtSql、QtSvg和QtXml等。比较常用的有QtCore和QtGui模块。

● QtCore。QtCore模块包含了核心的非GUI(图形用户接口)功能。所有其他Qt模块都依靠这个模块。

● QtGui。QtGui模块扩展了QtCore在GUI方面的功能。在<QtGui>头文件中为构成QtCore和QtGui组成部分的所有类进行了定义。其中包含了QMainWindow、QDockWidget、QButton、QCanvas、QDialog等窗口部件类,QLayout、QBoxLayout、QFormLayout等布局管理类,更多其他的类请参考帮助文档。

需要使用模块中的类时,可以在程序开始包含相应的模块。

例如,需要使用QtGui模块时,只要在代码头包含QtGui模块:

978-7-111-34147-5-Chapter02-47.jpg

另外,也可以只包含模块中使用到的类,而不包含整个模块。在本实验中,主要使用的模块如下:

978-7-111-34147-5-Chapter02-48.jpg

若在一些文件(如头文件)中,只用到对象的声明,而没有具体实现,可以使用前置声明的方式代替包含头文件,例如:

978-7-111-34147-5-Chapter02-49.jpg

(3)Qt中的类

为了适合用户的需求,Qt的API提供了几百个C++类,该类大多数用于专门的GUI。Qt还提供了基于模板的初始化、文件和通用的I/O设备、目录管理、日期/时间类、常用表达式解析等。目的是利用这些类,建立或生成不同的功能,用它们来实现Qt的通用化。下面通过本实验涉及的4个类(QWidget、QPushButton、QVBoxLayout、Qapplication)使大家对Qt中类的特点和用法有个大致的了解。程序中还用到了QLCDNumber和QSlider这两个类,但是由于它们是和QPushButton类似的窗口部件类,故不重复说明,相应的内容可以查阅相关帮助文档。

1)QWidget。QWidget是所有窗口部件(widget)类的基类,属于QtGui模块,继承自QObject和QPaintDevice。它能够接收鼠标、键盘和其他事件。窗口部件都是矩形的,如果未嵌入父窗口部件,就被称为窗口(window)。

按钮、菜单、滚动条和框架都是窗口部件。窗口部件也可以包含其他窗口部件。例如,应用程序窗口这个部件,通常会包含一个QMenuBar、几个QToolBar、一个QStatusBar等其他窗口部件。

在本实验中,自定义了一个窗口部件类MyWidget,它的一个对象widget作为应用程序的窗口,代码如下:

978-7-111-34147-5-Chapter02-50.jpg

这个自定义的MyWidget类以公有方式继承了QWidget。在开始时,声明了Q_OBJECT宏。然后,声明了一个构造函数,参数为父对象的指针,默认值为没有父对象。构造函数实现于另一个文件。在构造函数中,声明了3个部件对象:quit(QPushButton类)、lcd(QLCDNumber类)和slider(QSlider类),分别是退出按钮、液晶数字显示框和滑块。然后,通过信号与槽机制建立lcd和slider的连接。最后,声明了一个布局对象layout(QVBoxLayout类),对几个部件的布局进行设置。

2)QPushButton。QPushButton属于QtGui模块,继承自QAbstractButton,而QAbstractButton又继承自QWidget,其功能是提供一个命令按钮。这也许是在图形用户接口中最常用的窗口部件,用户通过按下或者单击按钮来命令计算机应答或执行操作。

在本实验中,QPushbutton的使用如下:

978-7-111-34147-5-Chapter02-51.jpg

第一行声明了一个QPushButton类的指针quit,并且调用了其构造函数,创建对象。该函数的原型如下:

978-7-111-34147-5-Chapter02-52.jpg

第一个参数是一个字符串,是在命令按钮上显示的文字;第二个参数是父对象,默认值为0,即没有父对象。

程序中,在传递字符串“Quit”时调用了tr()函数,这是把字符串翻译成其他语言的标记。在每个QObject对象以及包含有Q_OBJECT宏的子类中都含有这个函数的声明。也许当前没有准备将程序立刻翻译成其他语言,但是对每个用户可见的字符串使用tr()函数会提高程序的可扩展性,给以后的国际化带来便利。

第二行通过成员函数设置了字体。该成员函数由QPushButton从父类QWidget继承而来,函数原型如下:

978-7-111-34147-5-Chapter02-53.jpg

其中,QFont是QtGui模块中的一个类,它的一个常用构造函数的原型如下:

978-7-111-34147-5-Chapter02-54.jpg

第一个参数family为字体类型;第二个参数pointSize为字号,当为0或负数时,使用系统默认字体大小;第三个参数weight为字体的粗细,范围为0~99;第四个参数italic,是bool类型,若为true,则为斜体,否则为默认值。在本实验中,使用Times字体,18号,粗体,非斜体。(www.xing528.com)

3)QVBoxLayout。QVBoxLayout类将窗口部件垂直排列,属于QtGui模块,继承自QboxLayout,使用方法如下:

978-7-111-34147-5-Chapter02-55.jpg

978-7-111-34147-5-Chapter02-56.jpg

首先,创建布局对象,然后将窗口部件依次加入布局对象,最后调用setLayout()函数将该布局对象QVBoxLayout安装到窗口部件MyWidget。此时,布局对象中加入的窗口对象将自动以MyWidget为父对象。

4)QApplication。QApplication类属于QtGui模块,继承自QCoreApplication(属于QtCore模块)。QApplication类管理GUI应用程序的控制流和主要设置。它包含主事件循环,同时处理应用程序的初始化和结束,提供会话管理。此外,QApplication处理大多数的系统和应用程序的设置。

对于任何GUI程序,有且只能有一个QApplication对象。对于非GUI的Qt程序,使用QCoreApplication来替代,因为它不依赖QtGui库。

在本实验中,该对象的声明和使用如下:

978-7-111-34147-5-Chapter02-57.jpg

最后一行的exec()是QApplication的静态成员函数,调用后,进入主事件循环,等待用户的操作直到exit()被调用。主事件循环接收来自视窗系统的事件并发送给应用部件。用户的动作会让相应的响应程序生成一些事件,为了开始事件处理,必须要调用该函数。

(4)信号和槽

信号和槽机制是Qt编程的基础。它可以让应用程序编程人员把这些互不了解的对象绑定在一起。槽和普通的C++成员函数几乎是一样的——可以是虚函数,可以被重载,可以是公有的、保护的或者私有的,并且也可以被其他C++成员函数直接调用,它们的参数可以是任意类型的。唯一不同的是:槽还可以和信号连接在一起,在这种情况下,每当发射这个信号时,就会自动调用这个槽。

在Qt中,通过调用QObject对象的connect()函数来将某个对象的信号与另外一个对象的槽函数相关联。

connect()语句形式如下:

978-7-111-34147-5-Chapter02-58.jpg

这个函数建立了一个从sender对象的信号到receiver对象的槽的连接。

下面的例子建立了从slider的valueChanged()信号到lcd的display槽的连接:

978-7-111-34147-5-Chapter02-59.jpg

Qt的窗口部件通过发射信号来表明一个用户动作已经发生了或者是一个状态已经改变了。当用户滑动滑块(Slider)时,该滑块就会发射一个valueChanged()信号,连接着的QLCDNumber对象的display()槽自动执行,显示改变后的数值。

(5)程序的实现

本实验的Qt程序包含3个文件:mywidget.h、mywidget.cpp和main.cpp。

1)mywidget.h声明了作为应用程序的窗口的类MyWidget。

2)mywidget.cpp实现了mywidget.h中声明的MyWidget类。在类的构造函数中,声明了3个部件对象quit、lcd、slider,分别是退出按钮、液晶数字显示框、滑块,并且进行了相应的设置。lcd和slider通过信号与槽的机制相联系。滑动滑块后,slider发射信号valueChanged(),lcd的display()槽自动执行,显示当前滑块位置对应的数字。退出按钮quit的功能也由该机制实现。在3个部件对象的声明与设置完成之后,声明了一个布局对象layout。layout依次加入部件对象后,在主窗口安装布局管理器layout,完成布局设置。相应的代码已经在上面介绍,这里不再赘述。

3)main.cpp中为main()函数声明了一个QApplication对象和一个MyWidget对象,显示主窗口,通过调用exec()函数将应用程序的控制权传递给Qt,使程序进入事件循环状态,等候用户的操作。相应的代码在QApplication类的介绍中已经给出。

4.实验内容

浏览Qt的官方网站http://qt.nokia.com/,了解Qt的特点和应用。

下载Nokia Qt SDK,并进行安装。阅读手册中的“CreatingaMobileApplicationwith NokiaQtSDK”及其他帮助文档,了解建立手机应用程序的步骤。

浏览http://www.forum.nokia.com/Develop/Qt/Getting_started/,了解开发环境的基本使用方法,并阅读相关的Qt书籍或文档,了解Qt的编程方法和过程。

分析程序结构,通过Qt Assistant学习使用到的QWidget、QPushButton、QVBoxLayout、QLCDNumber、QSlider、QApplication等类,了解各自的用法、成员函数等。学习Qt的信号与槽机制,了解将用户的动作和一段代码连接起来的方法。编写Qt程序,在仿真器上查看。

5.实验步骤

1)安装开发包Nokia Qt SDK。

2)启动Qt Creator。

3)File→New File or Project→QtC++Project→Mobile Qt Application。单击“Choose”按钮。

4)Location设置。在D盘根目录下新建一个projects文件夹,用来保存新建的项目。在“Name”文本框中输入“mywidget”,Createin通过“Browse”按钮找到projects文件夹,单击“Next”按钮。

5)QtVersions设置。确保Qt Simulator复选框是选中的。单击“Next”按钮。

6)Details设置。在“Class Name”文本框中输入“MyWidget”,Base Class选择“Qwidget”,表示类MyWidget从QWidget继承。取消选中“Generate Form”复选框。单击“Next”按钮。

7)Summary。显示生成的工程中所包含的文件:main.cpp、mywidget.cpp、mywidget.h、mywidget.pro。如果没有问题,单击“Finish”按钮;否则,可以返回修改。

8)单击左侧工具栏中的“Edit”按钮,进入编辑模式,可以查看和编辑工程中的各文件。

9)单击左侧下方工具栏中的“BuildAll”按钮,如果有错误对程序进行调试。

10)单击左侧工具栏中的手机形状的图标,将编译目标选择为“Qt Simulator”。

11)单击左侧工具栏中绿色的“Run”按钮,程序在仿真器上运行,弹出如图2-12a所示的窗口。

12)滑块在最左边时,显示的是数值0,向右滑动,数值逐渐变大,到最右边时,显示的是数值99。单击“Quit”按钮,则退出程序,同时弹出“Qt Simulator Control”对话框,可以进行一些相应的设置,如View下的设备选择、旋转、缩放等操作。图2-12b是将Device选项由MaemoFremantle改为Symbian^3,并单击RotateDevice后的效果。

978-7-111-34147-5-Chapter02-60.jpg

图2-12 QtSimulator实验结果

a)Simulator窗口 b)QtSimulatorControl对话框

6.思考题

1)QtCreator、QtDesigner、QtAssistant等各有什么用途?

2)如何使用QtDesigner实现图形界面设计?

3)如何在命令行下使用qmake编译?

4)信号与槽机制和普通的函数调用有什么联系和区别?

7.补充阅读

[1]布兰切特,萨摩菲尔德.C++GUIQt4编程[M].2版.闫锋欣,等译.北京:电子工业出版社,2008.

[2]丁林松,黄丽琴.Qt4图形设计与嵌入式开发[M].北京:人民邮电出版社,2009.

[3]QtReference Documentation.http://doc.trolltech.com/4.6/.

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈