《基于ARM和QT的嵌入式图形用户界面设计与实现.doc》由会员分享,可在线阅读,更多相关《基于ARM和QT的嵌入式图形用户界面设计与实现.doc(11页珍藏版)》请在三一办公上搜索。
1、上海电力学院课程设计报告 题目: 基于ARM和QT的嵌入式图形用户界面设计与实现专业: 自动化(电站) 班级: XXXXXX 姓名: 学号: 一、Qt课题研究意义、国内外研究现状及应用分析:Qt 是一个跨平台的C+图形用户界面库,是挪威Trolltech 公司的产品。Qt 是一个全面的C+应用程序开发框架。它包含一个类库,和用于跨平台开发及国际化的工具。Qt 是用于本地化跨平台应用开发的领先性框架。Qt 应用程序接口与工具兼容于所有支持平台,让开发员们掌握一个应用程序接口,便可执行与平台非相关的应用开发与配置。通过使用Qt,开发小组们从主要的开发平台,可为主要操作系统创建本地化的应用程序。众多
2、的 Qt 类库构成Qt 的基础。该库可以利用大约400 个面向对象的类,这些类带有大多数构建跨平台服务器与富客户端应用程序的底层基础构造函数.这些库包括用于GUI、布局、数据库、国际化、网络与XML 等的类。在开发用户图形界面中,一个常见并重复发生的系统崩溃与问题源,即如何在不同组件之间进行通信。对于该问题,Qt 的解决方案为信号与槽机制。信号与槽是Qt 的主要特征,它对促进对象通信提供一个类型安全的方法,并可能是区别于其它多数框架所提供特征的一个部分。Qt/Embedded 是一个完整的自包含GUI 和基于Linux 的嵌入式平台开发工具,是Qt 在嵌入式平台的版本。Qt/Embedded
3、以原始 Qt 为基础,并做了许多出色的调整以适用于嵌入式环境。Qt/Embedded 通过 Qt API 与 Linux I/O 设施直接交互,成为嵌入式Linux 端口。同Qt/X11 相比,Qt/Embedded 很省内存,因为它不需要一个X 服务器或是Xlib 库,它在底层摒弃了X lib,采用framebuffer(帧缓冲)作为底层图形接口。同时,将外部输入设备抽象为keyboard 和mouse 输入事件。Qt/Embedde 的应用程序可以直接写内核缓冲帧,这避免开发者使用繁琐的Xlib/Server 系统。 图一、 Qt/Embedded 与Qt/X11 的比较Qt/Embedd
4、ed 的底层图形引擎基于Framebuffer。Framebuffer 是Linux 2.2.x 以上本版内核中的一种驱动程序接口。这种接口采用mmap 系统调用,将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映象,将其映射到进程地址空间之后,就可以直接进行读写操作了,而写操作可以立即反映在屏幕上。framebuffer 驱动程序是最重要的驱动程序之一,正是这个驱动程序才能使系统屏幕显示内容。其实现分为两个方面:一是对LCD 及其相关部件的初始化,包括画面缓冲区的创建和对DMA 通道的设置;二是对画面缓冲区的读写,具体到代码为read、write 等系统调用接口。Qtopia 是一
5、种全方位的应用程序开发平台,它可用于基于嵌入式Linux 的PDA(个人数字助理),移动电话,web pads,以及其他移动计算设备。Qtopia 构建于Qt/Embedded 之上,是专为基于Linux 的消费电子设备提供和创建图形用户界面而设计的。常见的有2 种版本:QtopiaPhone 版和Qtopia PDA 版。Qtopia Phone 版必须付费才能得到,而Qtopia PDA 版有免费版本。输入法:Qtopia 支持两种基本类型的输入法。Qtopia 可由带有少量按键的键盘驱动,也可由用于触摸屏设备的手写笔驱动。Qtopia 支持众多的文本输入方式,包括基于键盘的预测键入,可定
6、制的手写识别,以及屏幕键盘输入。此外,还支持数种可用于亚洲书写系统的第三方输入方式。国际化支持:Qtopia 内部使用统一的代码,因此可以很方便地针对不同的市场进行本地化。此外,程序的设计引擎能自动调整比原始文本长或短的翻译文本的按钮和标签。目前,Qtopia 支持多种语言。屏幕尺寸/布局:Qtopia 强大的设计引擎支持各种屏幕尺寸以及横向和纵向布局,包括176208,176220,240320 和480640 (像素)。程序发布器:Qtopia 含有一个程序发布器。根据使用版本的不同(PDA 或Phone),程序发布器也会有所不同,但它始终包含一个默认的基于图标的应用程序导航布局方案。插件
7、管理器:Qtopia 自带的插件框架使得向设备添加新特性无缝化且便捷。用户可以添加新字体,插入新的多媒体格式,添加或移除输入方式,插入新的媒体播放器外观,新的主项,以及许多其他特性。Qtopia PDA 版本简介:Qtopia PDA 版(Trolltech)是第一个用于嵌入式Linux PDA 的全方位应用程序开发平台。Qtopia PDA 版(Qtopia PDA),名副其实基于Linux 的PDA 的标准,可为新一代的高级移动计算设备提供稳定的软件平台。Qtopia PDA 运行于Linux 之上,只需占用少量内存就能提供强大的功能。Qt/Embedded 和Qtopia 开发模式: 嵌
8、入式软件开发通常都采用交叉编译的方式进行,基于 Qt/Embedded 与Qtopia 的GUI应用开发也采取这样的模式。先在宿主机上调试应用程序,调试通过通过后,经过交叉编译移植到目标板上。二、方案设计及功能模块: 方案:在pc机linux系统下安装qtpia软件,在安装完成qtpia后,利用Qt软件设计一个图形化界面“welcome to Qt”,进行“welcome to Qt”的编程,“welcome to Qt”实现的功能为,运行“welcome to Qt”,在开始界面上我们可以看到三个按钮,分别为显示字符串,quit(退出),dialog(对话框)。实现的功能,显示字符串,按qu
9、it退出程序,点击dialog出现对话框,实现人机交互。三、系统硬件平台: 硬件: PC 机 一台MagicARM2410 教学实验开发平台 一套四、系统软件功能设计,程序流程图及代码实现: 首先是安装qtpia,然后进行编程,以实现想要的软件功能。 图形化界面软件的功能大致为,运行程序点击按钮会显示一串字符,而通过编程我们可以改变软件的框图大小,软件名字有我们自定义,显示的字符标签也由我们自定义,然后我们可以插入按钮部件,用按钮来控制软件的下一步动作。 在对按钮编程时,我们可以自定义它的大小,且可以设置它的一些属性,比如显示按钮,按钮的名字等。 然后是对dialog按钮进行编程,它实现了显示
10、一个新的对话框,自定义对话框的标题,点击对话框中的按钮,将会关闭新对话框。最后对界面中的开始 布局 Button1Dialog Quit显示字符新对话框点击退出关闭对话框 图二、程序框图 按流程图我们按以下步骤完成实验:1、首先对主程序进行编写,步骤如下:(1) 进入/zylinux/x86-qtopia 目录,运行set-env 脚本,为本实验设置环境变量,然后创建文件夹hello。命令行中输入以下命令:$ cd /zylinux/x86-qtopia$ . set-env$ mkdir hello(2) 进入hello 目录,新建文件hello.cpp,并编写如程序清单 9.1 所示的程序
11、,然后用progen 工具生成工程文件hello.pro。命令行中输入:$ cd hello$ vi hello.cpp$ progen t app.t o hello.pro(3) 使用tmake 工具,生成hello 工程的Makefile 文件。命令行:$ tmake -o Makefile hello.pro(4) 修改Makefile 文件,在LIBS 变量中增加需要用到的库,然后输入make 命令编译。LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lqte -lm -lstdc+$ make(5) 启动虚拟控制台,运行hello 程序,将会得到如图 9.1 所
12、示的实验结果(主机须启动帧缓冲,必须能够访问/dev/fb0)。命令行:$ cd /zylinux/x86-qtopia$ . set-env$ cd hello$ ./hello qws或者在终端,启动虚拟缓冲区和 QPE,启动Qtopia 的终端,输入./hello 运行程序。命令行中输入: $ cd /zylinux/x86-qtopia$ . set-env$ cd hello$ qvfb&$ qpe2、按钮子程序编程步骤:(1) 进入/zylinux/x86-qtopia 目录,运行set-env 脚本,设置环境变量,然后创建文件夹button。命令行中输入:$ cd /zylinu
13、x/x86-qtopia$ . set-env$ mkdir button(2) 进入button 目录,新建文件button.cpp,并编写如程序清单 9.2 所示的程序,然后用progen 工具生成工程文件button.pro。命令行中输入:$ cd button$ vi button.cpp$ progen t app.t o button.pro(3) 使用tmake 工具生成Makefile 文件,并按照9.1 小节进行修改,编译程序,得到可执行文件button。输入命令:$ tmake o Makefile button.pro$ make(4) 启动虚拟控制台,运行button
14、程序。命令行中输入:$ ./button qws3、quit子程序编程步骤:(1) 进入/zylinux/x86-qtopia 目录,运行set-env 脚本,设置环境变量,然后创建文件夹signalslot。命令行中输入:$ cd /zylinux/x86-qtopia$ mkdir signalslot(2) 进入signalslot 目录,建立文件signalslot.cpp,并编写如程序清单 9.3 所示的程序,然后用progen 命令生成工程文件signalslot.pro。命令行中输入:$ cd signalslot$ vi signalslot.cpp$ progen t app
15、.t o signalslot.pro(3) 使用tmake 工具,生成signalslot 工程的Makefile 文件,然后编译,得到可执行文件signalslot。命令行中输入:$ tmake o Makefile signalslot.pro(4) 启动虚拟控制台,运行signalslot 程序,将会得到如图 9.3 所示的结果,点击“Quit”按钮,程序将退出。$ ./signalslot qws4、dialog对话框编程步骤:(1) 进入/zylinux/x86-qtopia 目录,运行set-env 脚本,设置环境变量,然后创建文件夹dialog.。命令行中输入:$ cd /zy
16、linux/x86-qtopia$ mkdir dialog(2) 进入dialog 目录,建立文件userdialog.h 和userdialog.cpp,(程序在下面程序清单中),然后用progen 工具生成工程文件userdialog.pro。输入命令:$ cd dialog$ vi userdialog.h$ vi userdialog.cpp$ progen t app.t o userdialog.pro(3) 使用tmake 工具生成userdialog 工程的Makefile 文件,编译生成可执行文件userdialog。命令行中输入命令:$ tmake o Makefile
17、userdialog.pro$ make(4) 启动虚拟控制台,运行userdialog 程序,点击POPUP 按钮,将会弹出一个新的对话框,点击对话框的POPDOWN 按钮,新对话框将关闭。命令行中输入命令:$ ./userdialog qws5、对按钮进行布局步骤:(1) 进入/zylinux/x86-qtopia 目录,运行set-env 脚本,设置环境变量,然后创建文件夹layout。$ cd /zylinux/x86-qtopia$ . set-env$ mkdir layout(2) 进入layout 目录,建立文件layout.cpp,然后用progen 工具生成工程文件layo
18、ut.pro。$ cd layout$ vi layout.cpp$ progen t app.t o layout.pro(3) 使用tmake 工具,生成layout 工程的Makefile 文件,编译,得到可执行文件layout。$ tmake o Makefile layout.pro(4) 启动虚拟控制台,运行layout 程序, $ ./layout -qws 6、主程序与各子程序代码:主程序hello:#include /Qt 应用程序必须包含该文件#include /使用标签所需头文件int main(int argc, char *argv)QApplication app(
19、argc, argv); /创建一个名为app 的QApplication 对象QLabel *label = new QLabel(Hello, Qt!, 0); /创建一个QLabel 部件label-setAlignment(Qt:AlignVCenter|Qt:AlignHCenter); /设置标签在水平/垂直方向位于中心位置label-setGeometry(10, 10, 200, 80); /标签坐标(10,10)和大小(20080)app.setMainWidget(label); /将QLabel 对象插入到主窗口中label-show(); /显示标签。创建的标签默认不可
20、见。int result = app.exec(); /进入循环,调用exec()函数,处理来自系统和用户的事件return result;按钮子程序:#include /Qt应用程序必须包含该头文件#include /使用按钮所需头文件#include /字体int main(int argc, char *argv)QApplication button(argc, argv); /创建一个名为button 的QApplication 对象QPushButton hello(Hello, Button!, 0); /创建一个名为hello 的按钮hello.resize(150, 30);
21、 /设置按钮大小为15030hello.setFont(QFont(Helvetica, 18, QFont:Bold); /设置按钮的字体button.setMainWidget(&hello); /将按钮作为主窗口部件hello.show(); /显示按钮int result = button.exec(); /进入循环return result;Quit子程序:#include /Qt应用程序必须包含的头文件#include /按钮#include /字体int main(int argc, char *argv)QApplication app(argc, argv); /创建一个名为
22、app 的QApplication 类对象QPushButton quit(Quit, 0); /创建按钮“quit”quit.resize(100, 30); /设置按钮大小quit.setFont(QFont(Times, 18, QFont:Bold); /设置按钮的字体/将按钮的clicked()信号和app 的quit()槽连接起来,当按钮被按下,程序退出。QObject:connect(&quit, SIGNAL(clicked(), &app, SLOT(quit();app.setMainWidget(&quit); /将app 对象添加到主程序中quit.show(); /显
23、示quit 按钮return app.exec();Dialog子程序:userdialog.h的程序内容:#ifndef _USERDIALOG_H_#define _USERDIALOG_H_#include /Qt应用程序必须包含的头文件#include /对话框#include /按钮class userDialog:public QWidgetQ_OBJECTpublic:userDialog(QWidget *parent = 0, const char *name = 0);private slots:void popupDialog();#endifuserdialog.cpp
24、的程序清单:#include userdialog.huserDialog:userDialog(QWidget *parent, const char *name):QWidget(parent, name)QPushButton *btn = new QPushButton(POPUP, this); /创建POPUP 按钮btn-setGeometry(50, 20, 100, 40); /设置按钮位置和大小/将btn 的clicked()信号和popoDialog()槽连接connect(btn, SIGNAL(clicked(), this, SLOT(popupDialog();v
25、oid userDialog:popupDialog()QDialog *dlg = new QDialog(0, popup, FALSE); /创建对话框dlg-setCaption(A QDialog Window); /设置对话框标题QPushButton *btn = new QPushButton(POPDOWN, dlg); /创建POPDOWN 按钮btn-setGeometry(50, 20, 100, 40); /设置按钮的位置和大小connect(btn, SIGNAL(clicked(), dlg, SLOT(accept(); /将btn 的clicked()信号和a
26、ccept()槽连接dlg-show();int main(int argc, char *argv)QApplication app(argc, argv); /创建一个名为app 的QApplication 对象userDialog udlg; /创建对话框udlg.show(); /显示对话框app.setMainWidget(&udlg); /添加到主程序中return(app.exec(); 布局程序:#include /Qt应用程序必须包含的头文件#include /标签#include /按钮#include /布局class DemoWidget:public QWidgetp
27、ublic:DemoWidget( QWidget *parent=0, const char *name=0);DemoWidget:DemoWidget( QWidget *parent, const char *name):QWidget(parent, name)setCaption(QT_LAYOUT_DEMO); /设置标题QBoxLayout *demoLayout = new QVBoxLayout (this, 5); /垂直布局容器QBoxLayout *buttons = new QHBoxLayout(demoLayout); /水平布局容器/创建4 个按钮int i;
28、for (i=1; isetText(s);/添加到水平容器中buttons-addWidget( btn, 10 );/创建标签,添加到垂直容器中QLabel *lbl = new QLabel(this);lbl-setText(This is a Label);lbl-setFrameStyle( QFrame:Panel | QFrame:Sunken );lbl-setFixedHeight( lbl-sizeHint().height() );lbl-setAlignment( AlignVCenter | AlignLeft);demoLayout-addWidget(lbl);
29、 /添加标签demoLayout-activate(); /激活布局int main(int argc, char *argv)QApplication app(argc, argv);DemoWidget demo;app.setMainWidget(&demo);demo.show();return app.exec();五、实验测试与结果分析: 按照实验步骤对程序进行编写,然后进行调试,得到想要的图形化界面软件。 按程序输入,编译运行可以得到图形化界面“hello”,按对应按钮可以实现相应的程序。在这个界面中我们可以看到三个按钮,分别是hello,quit和dialog。点击hello则
30、显示预先输入的字符串“Hello, Qt!”,点击quit将会退出程序。点击dialog会出现一个新的对话框,对话框的名字是由我们自定义的。并且对话框中有一个按钮,点击按钮则会结束这个对话框。注意事项:(1) 如果在PC 中运行hello 程序,出现某些库找不到,该如何处理?提示:将所缺的库从/zylinux/x86-qtopia/qt/lib 目录下复制到主机系统/usr/lib 目录下即可。(2) 在ARM 上运行时如果也出现类似问题,又该如何解决?提示:将所缺的库从/zylinux/arm-qtopia/qt/lib 目录下复制到目标系统/usr/lib 目录下即可。六、实验心得: 在做
31、这个实验过程中我们遇到了一些问题,首先是找不到qtpia的安装文件,在网上也找不到,或者找到的是都是不对的,最后这个问题是在老师那里找到的源文件,接下来就是由于对linux的基本操作命令不是很熟悉,所以在做的过程中,遇到了一些小问题,不过在我们的共同努力下都完成了。从挂载u盘到复制文件,这些问题我们都通通解决了,同时在老师的帮助下我们也解决了一些我们解决不了的问题。到课程结束,我们小组完成了此次实验。 通过此次试验对qt有了初步的了解,对它的应用和安装有了相对的了解,对linux的命令有了一定的了解,对一些简单的命令基本掌握了,相信这些对以后进一步学习linux有很大的帮助,虽然我们只是掌握了基本的命令,同时对一些深度的命令不是很了解,但是我们相信在以后的生活中,对学习这门课的方法我们会用到。特别是对以后我们子自学这门课有更多的帮助。 以前对别人能够制作一个软件感到很神奇,觉得很了不起,在接触qt后,我发现,要想编写一个小型的图形化界面其实并不是想象中的那么难,同时这也让我对qt产生了一定的兴趣,在以后一定会对它进行更深入的理解,因为觉得它的功能真的很强大。也希望自己能编写出一个属于自己的图形化界面软件。 这次实验最大的收获就是对linux有了基本的入门,让我们想要继续深入学习linux的话,会比较容易,不至于找不到方向。