基于Qt的嵌入式Linux开发的GUI设计研究与实现

基于Qt的嵌入式Linux开发的GUI设计研究与实现

【摘 要】随着嵌入式系统的发展,在Linux下使用Qt开发嵌入式应用程序是嵌入式图形用户界面(GUI)系统应用研究的重点。 本文结合智能温度控制系统人机界面开发的需求,介绍了Qt 及其第三方插件图形库Qwt 的特点,并详细描述了嵌入式GUI开发环境的搭建及嵌入式Linux程序开发的关键技术,包括信号与槽机制的使用、程序主要功能代码的实现。最后介绍了智能温度控制系统GUI中串口通信及图形绘制等关键部分的设计与实现。【关键词】Qt;Linux;Qwt;嵌入式系统;图形用户界面

0 引言

随着计算机技术和信息网络技术的飞速发展, 嵌入式系统的应用越来越广泛,越来越受到人们的青睐。嵌入式技术被应用于各个领域,如消费电子、工业控制等领域。大多数的工业检测系统都涉及到现场数据的实时采集,要求有更加友好、便于操作的人机交互界面,利用Qt及其第三方插件图形库Qwt 能设计出加快图形显示的操作方便的嵌入式智能终端控制系统。本文以智能温度控制系统的开发为背景,介绍了Qt及其第三方插件图形库Qwt,最后介绍了智能温度控制系统GUI中串口通信等关键部分的设计与实现。

1 系统平台的构建

由于嵌入式系统本身硬件条件的一些限制, 需为系统开发构建交叉编译环境。交叉编译环境是由宿主机和目标板两套计算机系统构成的。

本文的宿主机是在PC机上使用VMware Workstation 构建的Linux系统,使用的是Fedora13。目标板基于三星S3C2440处理器, 并扩展了触摸屏、NAND FLASH、串口、网口、SD 卡座、JTAG 等块。目标板如图1 所示:

图1. 系统所使用的目标板平台

2 Qt及第三方插件图形库Qwt简介

2.1 Qt简介

Qt是Trolltech开发的专门为小型的嵌入式设备提供图形交互界面的C++开发框架,是一个跨平台应用程序和UI框架,它包括跨平台类库、集成开发工具和跨平台IDE。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt按照应用环境的不同,可以分为PC机环境的X11版本(Qtxll)与嵌入式环境的Embedded版本(Qt/Embedded)。

Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。Qt/Embedded 不依赖于X Window,在底层直接对framebuffer(帧缓冲)进行操作。使用Qt只需一次性开发应用程序,无须重新编写源代码,便可在不同桌面和嵌入式操作系统部署这些应用程序。它提供了丰富的窗口部件集,具有面向对象、易于扩展、真正的组件编程等特点。

2.2 第三方插件图形库Qwt简介

Qwt 是一个基于LGPL 版权协议的开源项目,Qwt 类库包含GUI 组件和一组实用类。提供了一组2D 的窗体库来显示数据,显示方式主要有曲线、罗盘、滑尺、旋转体等。该工具库基于Qt 开发,所以也继承了Qt 的跨平台性,在使用Qt 进行图形界面开发的环境中都可以使用Qwt。在工控领域的检测系统中常涉及到对检测数据的实时显示,利用Qwt 库中的类可以快速地开发出符合要求的显示图。

3 Qt/Embedded开发环境的搭建

嵌入式平台上的图形界面程序采用交叉编译的方式进行,即先在装有Linux系统的宿主机上进行开发, 再进行交叉编译生成目标板所能执行的程序。开发环境的建立主要包括宿主机和目标板两个部分。在PC宿主机上,需要的编译器是gcc-4.1.2,除此之外,还需要得到两个版本的Qt,分别是:Qt-4.7.3和QtEmbedded-4.7.3-arm。前者用于在PC上对程序的开发调试,使我们能确保程序放到板子上之前就符合设

计的要求;后者的库能将调试好的程序编译成能在arm-linux平台上运行的程序。

Qt-4.7.3可以用从是Trolltech 公司官方网站下载

的qt-x11-opensource-src-4.7.3.tar.gz编译后安装得到,同样的,QtEmbedded-4.7.3-arm也可从其官网下载qt-embedded-linux-opensource-src-4.7.3.tar.gz编译后安装得到。在编译QtEmbedded-4.7.3-arm之前,必须准备好arm-linux-gcc交叉编译工具,用的版本是arm-linux-gcc-4.3.2。

3.1 Qt/Embedded在x11平台下的安装

Qtxll版本可以生成虚拟帧缓存(qvfb),模拟嵌入式系统的运行状态,并在PC机上查看程序的运行结果。同时产生Qt开发工具,如designer等等。 3.1.1 Qt-4.7.3的安装及配置

#tar zxvf qt-x11-opensource-src-4.7.3.tar.gz,cd进入这个目录,准备开始编译。在终端中这样操作: #./configure –qvfb //编译配置 #make //正式编译 #make install 设置环境变量:

export QTDIR=/qtxl 1

export PATH=/$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=/$QTDIR/lib:$LD_LIBRARY_PATH

3.1.2 QtEmbedded-4.7.3-arm的安装及配置

在编译安装qt-embedded-linux-opensource-src-4.7.3之前,必须先配置好arm-linux-gcc-4.3.2.tar.bz2将其解压到目录/usr/local下,此时local下出现一个名为arm的目录,然后配置好环境变量:在/etc/profile添加一句:export PATH=$PATH:/usr/local/arm/4.3.2/bin,保存后#source /etc/profile,让它即时生效。之后进行编

译:#make,#make install。

3.2 ARM 平台Qt库编译与移植

3.2.1 编译ARM 平台Qt 库

进入qt-arm-src-4.7.3目录:cd qt-arm-src-4.7.3配置Qt 库。在./configure命令中通过参数-embedded arm 指定生成库的平台.由于目标板使用的是触摸屏,在配置的时候需指定触摸屏所需的tslib库的路径。编译安装:make,make install。编译生成的ARM 平台Qt 库安装在/opt/ qt-4.7.3目录下。 3.2.2 移植qt-4.7.3到目标板

在目标板上执行Qt 程序时需要调用相关的Qt 库, 所以需在/opt/qt-4.7.3目录下提取必要的文件如:lib和plugins目录中的文件,并拷贝到目标板/opt/ qt-4.7.3的相应目录中,在目标板上运行Qt应用程序之前先要进行环境变量的配置。可以写入脚本文件中,

要设置时直接执行脚本文件即可。

3.3 Qwt图形库的编译与移植

本文使用的是qwt-6.0.1.zip。解压Qwt源码包:unzipqwt-6.0.1.zip。由于使用交叉编译的方式进行开发,所以编译的Qwt 库必须包括宿主机和目标机两个版本,需两份源码包,分别命名为qwt-x11-6.0.1和qwt-arm-6.0.1。

3.3.1 编译生成宿主机上的Qwt库

设置环境变量指定宿主机上开发Qt 程序所使用的库对应的qmake,这里使用嵌入式X86 版本的Qt 库来进行开发,所以设置如下:

export PATH=/usr/local/Trolltech/Qt-x11-4.7.3 /bin /:$PATH

进入目录qwt-x11-6.0.1,编译生成Qwt 库文件:qmake,make。对编译好的Qwt库进行安装:make install,安装目录可以通过修改qwt 源码目录中的qwtconfig.pri文件来实现。 3.3.2 编译生成ARM 平台的Qwt库

设置环境变量指定目标板上使用的Qt库对应的qmake,设置如下:

export PATH=/opt/qt-4.7.3/ bin:$PATH

进入目录qwt-arm-6.0.1,编译生成,Qwt 库文件并安装:qmake,make,make install。通过修改qwtconfig.pri设置安装目录。

最后,由于开发的Qt 应用程序中使用了Qwt 库文件, 所以需要将生成的ARM 平台的Qwt 库文件拷贝到目标板的/opt/qt-4.7.3/lib目录下。

4 智能温度控制系统的GUI设计

4.1 智能温度控制系统的GUI架构介绍

智能温度控制系统GUI部分属于系统的控制层,主要完成人机交互界面设计、参数设定、数据存储及其分析等功能。选用ARM2440+Linux2.6.30内核的操作系统,提高了系统可靠性。它和下层的接口采用串行口方式完成。

控制层的GUI部分主要完成智能温度控制系统的状态显示、系统参数的设置、信息存储及系统状态图表的输出等功能。控制层所需的数据信息都是下一层控制层通过串口传输过来的。

4.2 智能温度控制系统的GUI界面开发

在Qt中,“事件驱动”通过Signal—Slot(信号和槽)机制实现。Signal主要是各可视化组件产生的事件,这些事件通常由Qt控件预定义,如按钮单击事件

clicked等。Slot是对某个事件的处理方法,它也属于类的成员函数,其编写和普通成员函数类似。当需要处理某组件的Signal事件并要求把定义好的Slot作为响应事件的方法时,只要在实现文件中使用connect函数把Signal和指定的Slot连接起来即可。当对象改变其状态时,信号被发送,对象不关心有没有其它对象接收到这信号,可以将信号和槽通过connect函数任意相连。

4.2.1 创建GUI基本框架

启动Qt Creator,根据工程的创建向导生成基于QWidget的Qt4 应用程序。由于程序要实现多个功能模块,每个模块有不同的界面设计和布局, 为了方便布局使用了Qt Creator 中的Stacked Widget 控件作为程序界面的主框架控件。Stacked Widget 控件可包含多个页,根据功能模块的要求在各页上放置所需控件,完成布局。在Stacked Widget下面是Push Button按钮,通过这些按钮来实现Stacked Widget 中不同页的切换。主界面如图2 所示。

图2. 智能温度控制系统的GUI界面

为了实现通过按钮来切换Stacked Widget中页的功能,利用了Qt中的信号和槽机制。为每个按钮控件

定义一个槽函数,并与按钮的clicked()信号进行连接。在槽函数中调用QStackedWidget类的setCurrentIndex(int index)函数实现Stacked Widget 页的切换。 4.2.2 第三方插件Qwt图形库完成图表显示

这一部分主要完成对接收的数据的实时显示。通过使用Qwt图形库提供的相关类,快速实现基于Qt 的图表显示。主要使用了QwtPlot、QwtPlotCurve、QwtLegend 等类来完成。温度曲线如图3所示。

图3. 智能温度控制系统的温度曲线图

4.3 串口模块的设计与实现

由于GUI 界面显示所需的数据是通过串口从控制层获取的,所以串口通信模块是系统中的关键部分。要使用串口首先必须打开串口设备并设置属性,如下是打开串口的实现代码:

ManageSerialPort::open() {

res=extSerialPort.open(QIODevice::ReadWrite;//以读写方式打开串口,res=true

if (closeCalled)//若关闭的调用状态为true { if (saveStateSendEnabled)//若保存发送使能

状态为true enableSending();

if (saveStateReceivedEnabled)//若保存接收使能状态为true enableReceiving(); if (saveStateReceiveData)//若保存接收数据的状态为true receiveData();

closeCalled = false;

} return res;

}

打开串口设备后,关键是实现对设备的读写操作,这里主要说明对串口的读操作。当串口收到数据时,系统应该及时的读取数据并进行存储和显示。这里读取串口数据利用了Qt的事件驱动机制,系统使用了Qt的QSocketNotifier 类来监听串口是否有数据,并结合Qt的信号和槽机制,完成串口数据的读取。当串口接收到数据时,QSocketNotifier 发射activated 信号,通过在系统中创建一个接收数据的槽函数连接到此信号。

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4