一个成功的电能监测装置离不开一个成功的用户界面。本文采用Qt/E作为用户界面的开发工具。
Qt是Trolltech公司的一个产品。Qt是一个跨平台的C++图形用户界面应用程序框架。他提供给应用程序开发者建立图形用户界面应用程序所需要的所有功能,提供了丰富的宽口部件集,具有面向对象、易于扩展、真正的组件编程等特点。Qt与Windows下的MFC的实质是一样的,其最大的优点在于其跨平台性,可以支持现有的多种操作系统平台,主要有:
MS/Windows-95、98、NT4.0、ME和2000
Unix/X11 - Linux、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、
SGI IRIX和其它很多X11平台
Macintosh - Mac OS X
Embedded - 有帧缓冲(frame buffer)支持的Linux平台。
1.1 Qt/Embedded简介
Qt/Embedded是著名的Qt库开发商Trolltech公司开发的面向嵌入式系统的Qt版本,很多基于Qt的X Window程序可以非常方便地移植到Qt/Embedded上,在底层丢弃了X Lib,仅采用FrameBuffer作为接口,减少了系统开销。
Qt/Embedded类库完全采用C++封装。使用X下的开发工具Qt Designer可以直接开发基于Qt/Embedded的UI(用户操作接口)界面。
1.2 Qt/Embedded的使用
信号与槽是一种强有力的对象通信机制,它面向对象且灵活,用C++实现,可以完全取代传统工具中的回调和消息映射机制。
Qt的窗口在事件发生后会触发信号,如:当一个按钮被按下是,就会激发cliked()信号,程序员可以创建一个函数并调用connect()函数来连接信号,这样就将信号与槽联系起来了。信号与槽机制不需要对象间相互知道细节,这使得代码重用性变得十分容易。这种机制是类型安全的,类型错误被当成警告而不会引起程序的崩溃。如:一个“下一步”按钮的clicked()信号被连接到一个应用程序的函数next()槽,用户就可以单击按钮来进入到下一步的操作,代码如下:
Connect(button,SIGNAL(clicked()),qApp,SLOT(next()));
在QT程序执行期间是可以随时增加或撤销信号与槽的连接。撤销信号与槽的连接代码如下:
Disconnect(button,SIGNAL(clicked()),qApp,SLOT(next()));
信号与槽机制扩展了C++语法,充分利用了C++的面向对象的特性,它是类型安全的,可重载或重新实现。
Qt拥有一系列能满足不同需求的窗口部件,如按钮、滚动条等。Qt的窗口部件使用很灵活,能够适应子类化的特殊要求。
Qt中有三个主要的基类:QObject、QTimer和QWidget。窗口部件是QWidget或其子类的实例,自定义的部件则通过子类继承得来。QWidget类的继承如图4-2所示。
一个窗口部件可以包含任意数量的子部件。子部件在父部件的区域内显示。没有父部件的部件是顶级部件(比如一个窗口),Qt不在窗口部件上施加任何限制。任何部件都可以是顶级部件;任何部件都可以是其他部件的子部件。通过使用布局管理器可以自动设定子部件在父部件区域中的位置,如果喜欢也可以手动设定。如果父部件被停用、隐藏或删除后,同样的动作会递归地应用于它的所有子部件。
2. 建立Qtopia-2.2.0的开发平台
对于QT开发环境的安装包括基于PC机开发环境安装和基于ARM开发环境安装两种。本文在建立这两种开发环境时需要的资源包为广东天嵌科技有限公司提供的Qte的源码包:Qte_20101601.tar.bz2。
首先解压源码包到第3章建立的Linux操作系统中,在Linux的终端输入:#tar xvfjQte_20100601.tar.bz2 –C /。
下面对源码包中的各个文件进行说明:
arm-qtopia-2.2.0_build:将qtopia-2.2.0.tar.bz2源码编译成arn版本并且编译tslib-1.4.1.tar.bz2源码和EmbedSky_apps.tar.bz2源码。
arm-qtopia-2.2.0-konqueror_build:在arm-qtopia-2.2.0_build的基础上增加了konqueror.tar.bz2的编译。
setARM_QpeEnv:设置ARM版本的环境变量的脚本。
setX86_QpeEnv:设置X86版本的环境变量的脚本。
x86-qtopia-2.2.0-konqueror_build:在x86-qtopia-2.2.0_build的基础上增加了konqueror.tar.bz2的编译。
EmbedSky_apps.tar.bz2:应用程序的源码包。
konqueror.tar.bz2:Web浏览器的源码。
qtopia-2.2.0.tar.bz2:qtopia-2.2.0的源码。
text_x86:当PC版本的Qtopia-2.2.0编译成功后,仿真时的运行脚本。
tslib-1.4.1.tar.bz2:触摸校正的源码。
在PC的Linux操作系统下编译Qtopia-2.2.0时,在其终端输入执行命令:# ./ x86-qtopia-2.2.0-konqueror_build。
编译ARM版本的Qtopia-2.2.0,此编译针对TQ2440开发板的Qt的方法,在PC的Linux的终端执行命令:# ./ arm-qtopia-2.2.0-konqueror_build
在PC的Linux系统下仿真Qtopia-2.2.0时,可在其终端中输入执行命名:#/test_x86。即可在打开的仿真窗口中打开qtopia的运行界面。另一种方法也可以在Linux系统下运行Qtopia,步骤如下:
(1)环境变量:#. setX86_QpeEnv 或者# source setX86_QpeEnv
(2)启动虚拟帧缓存:#qvfb –width 640 –height 480 &
(3)运行qtopia:#qpe &
3 利于Qt designer编译应用程序
Qtdesigner是用来设计和实现用户界面并能够在多平台下使用的一种工具。Qt设计器可以使用用户界面设计变得简单。任何时候你可以要求所生产的代码去重建Qt设计器产生的用户界面文件,并可以根据你的喜好来改变设计。
Qtdesigner帮助你使用布局工具在运行时自动的移动和缩放你的部件(Windows中的术语控件)来构建用户界面。最终界面既好看又好用,使最终用户拥有一个舒适的操作环境并且能够方便的进行参数的选择。Qt设计器支持信号和槽机制以使部件之间能够进行有效的通信。Qt设计器包含一个代码编译器,是你能够在合成的代码里面潜入自己定制的槽。有些更喜欢使用手工方法分解合成代码的朋友也能够继续使用基类,因为西欧哪个第一版得Qt设计器开始就把这些基类移植进去了。
Qtdesigner的开发环境如图4-5所示,作为Linux系统下最好的图形开发工具,Qt有很多美观大方的控件来方便我们布局,实现所需要的功能。
利用Qt designer设计一个界面的具体步骤如下:
(1)设置环境变量,环境变量如图4-6所示,在终端中输入命令如下:
#cd /opt/EmbedSky/Qte
# source setX86_QpeEnv
(2)建立项目文件,打开Qt designer,建立应用所需的窗口控件,保存为*.ui文件,在终端中输入命令如下:
#cd x86-qtopia-2.2.0
#qt2/bin/designer &
(3)使用uic和moc工具将*.ui文件转换为*.h、*.cpp、moc_*.cpp文件。输入命令如下:
#uic -o *.h *.ui
#uic -o *.cpp -impl *.h *.ui
#moc *.h -o moc_*.cpp
(4)编写主函数,一个嵌入式Qt/Embedded应用程序应该包含一个主函数,主函数是应用程序执行的入口点。在终端中输入命令:
#gedit mian.cpp
(5)使用tmake中的progen软件产生*.pro文件,并将文件中的qt改为
qtopia,在终端中输入如下命令:
#progen
#progen -o *.pro
#gedit *.pro
(6)生产Makefile文件,在终端中输入命令:
#tmake -o Makefile *.pro
编译器是根据Makefile文件内容进行编译的,所以需要生产Makefile文件,Qt提供的Tmake工具可以从一个工程文件(*.pro文件)中生产Makefile文件。
(7)制作启动器,创建一个桌面启动器(*.desktop)文件,其对应的文件内容为固定格式。
(8)制作桌面图标,使用photoshop软件可生成,桌面图标对应的格式为*.png,图片大小是16*16。
(9)修改*.cpp文件,按照预期实现的功能,修改*.cpp文件。
(10)执行make命令进行编译,可生成在x86环境下的可执行文件,可以
启动虚拟帧缓存进行仿真运行结果。
经过上述步骤实现编译的二进制文件只能在PC机上运行,不能在ARM开发板上运行,需要交叉编译才能得到在ARM开发板上运行的二进制文件。得到在ARM开发板上运行的二进制文件,也需要设置环境环境变量设置。在终端中输入如下命令:
#cd /opt/EmbedSky/Qte
#source setARM_QpeEnv
#TMAKEPATH
#cd arm-qtopia-2.2.0/pro/power
#tmake -o Makefile *.pro
#make
执行make命令生成在ARM开发板上运行的二进制文件。