图形界面应用程序设计.docx
《图形界面应用程序设计.docx》由会员分享,可在线阅读,更多相关《图形界面应用程序设计.docx(15页珍藏版)》请在冰豆网上搜索。
图形界面应用程序设计
课题要求
一.课题目的
了解在Linux下安装Qt的基本步骤。
学会在Qt环境在X11平台下程序设计的方法。
学会在使用QtDesigner编写程序,编译,本机上运行。
学会QT/E在ARM设备上的移植方法与步骤。
学习QT中信号与槽的编程。
掌握QT/E在ARM设备上的常用输入输出设备移植方法。
设计一个简单图形界面的应用。
二.运行环境
硬件:
up-Star认证考试实践板、PC机Pentumn500以上,硬盘80G以上。
软件:
PC机操作系统RHEL4+xshell+ARM-Linux开发环境
qt-embedded-linux-opensource-src-4.4.0.tar.bz2
tslib-1.4.tar.bz2arm-linux-gcc-3.4.1.tar.bz2
正文
一.课题分析
图形界面应用程序设计这一课题实现过程相对较复杂,从Qt的安装到最终的移植实现大致要经过三个步骤。
首先,在Linux下安装与建立Qt桌面运行环境;其次,熟悉QtDesigner,并使用QtDesigner编写程序、编译,在本机运行;最后,移植QT/E到ARM设备。
二.方案设计
(一)安装与建立Qt桌面运行环境
编译QT-X11环境:
将/up-Star2410/gui/Qt/src下实验用到的三个文件拷贝到/home/sprife/for_pc目录下。
拷贝库文件:
#cd/home/
#mkdirsprife//新建文件夹sprife
#cdsprife//打开文件夹sprife
#mkdirfor_pc
#cdfor_pc
#cp/up-Star2410/gui/Qt/src/qt-x11-opensource-src-4.4.0.tar.gz.///拷贝文件
安装编译器arm-linux-gcc-3.4.1:
[root@BCsrc]#cd/up-Star2410/gui/Qt/tools//打开tools文件夹
[root@BCtools]#tarxjvfarm-linux-gcc-3.4.1.tar.bz2-C.///解压缩文件
[root@BCtools]#vi/root/.bash_profile//打开文件
将该文件中的PATH变量改为PATH=$PATH:
$HOME/bin:
/up-Star2410/gui/Qt/tools/usr/local/arm/3.4.1/bin/,存盘后退出。
[root@BCtools]#source/root/.bash_profile
如果安装正确的话,在任意路径下输入ar后按Tab键即可列出编译器文件。
Qt本机环境的搭建:
#cd/home/sprife/for_pc
#tarxzvfqt-x11-opensource-src-4.4.0.tar.gz//文件解压缩
#cdqt-x11-opensource-src-4.4.0
#./configure-prefix/usr/local/Trolltech/Qt-x11-4.4.0//对Qt进行配置
出现安装提示时选择yes注意大小写
#gmake//编译QT环境
#gmakeinstall//安装QT环境
以上各步都成功编译通过后,通过运行Qt/Embedded自带的demo来查看运行结果。
#cd/home/sprife/for_pc/qt-x11-opensource-src-4.4.0/examples/widgets/wiggly/
#./wiggly//运行可执行文件
运行结果如图1:
图1
Hello,QT!
程序设计:
在已经建立好了在本机上开发Qt应用程序环境下,编写一个“Hello,QT!
”的程序来了解Qt程序设计。
建立一个名为hello的目录,在目录下建立一个名为hello.cpp的c++源文件:
#cd/home/sprife/
#mkdirhello
#vihello.c
编辑hello.cpp源文件,填入程序代码,如图2:
图2
第1行和第2行包含了两个类的定义:
QApplication和QLabel。
对于每一个Qt的类,都会有一个同名的头文件,头文件里包含了这个类的定义。
第3行是程序的入口。
几乎在使用Qt的所有情况下,main()函数只需要在把控制权转交给Qt库之前执行一些初始化,然后Qt库通过事件来向程序告知用户的行为。
argc是命令行变量的数量,argv是命令行变量的数组。
这是一个C/C++特征。
它不是Qt专有的,无论如何Qt需要处理这些变量
第5行定义了一个QApplication对象App。
QApplication管理了各种各样的应用程序的广泛资源,比如默认的字体和光标。
App的创建需要argc和argv是因为Qt支持一些自己的命令行参数。
在每一个使用Qt的应用程序中都必须使用一个QApplication对象,并且在任何Qt的窗口系统部件被使用之前创建此对象是必须的。
App在这里被创建并且处理后面的命令行变量(比如在X窗口下的-display)。
需注意,所有被Qt识别的命令行参数都会从argv中被移除(并且argc也因此而减少)。
第6行创建了一个QLabel窗口部件(widget),用来显示“Hello,Qt!
”。
第7行使我们创建的QLabel可见。
当窗口部件被创建的时候,它总是隐藏的,必须调用show()来使它可见。
通过这个特点我们可以在显示这些窗口部件之前定制它们,这样就不会出现闪烁的情况。
第8行就是main()将控制权交给Qt。
在这里,程序进入了事件循环。
事件循环是一种stand-by的模式,程序会等待用户的动作(比如按下鼠标或者是键盘)。
用户的动作将会产生程序可以做出反应的事件(也被称为“消息”)。
程序对这些事件的反应通常是执行一个或几个函数。
为了简单起见,我们没有在main()函数的结尾处调用delete来删除QLabel对象。
这种内存泄露是无害的,因为像这样的小程序,在结束时操作系统将会释放程序占用的内存堆。
编译、运行程序,如图3:
#/home/sprife/for_pc/qt-x11-opensource-src-4.4.0/bin/qmake-project
#/home/sprife/for_pc/qt-x11-opensource-src-4.4.0/bin/qmake
#make
#./hello//执行程序
图3
(二)使用QtDesigner编写程序、编译、本机上运行
使用QtDesigner实现一个对话框,包括以下步骤:
1)、创建并初始化子窗口部件。
2)、将子窗口部件放置到布局当中。
3)、对Tab的顺序进行设置。
4)、放置信号和槽的连接。
5)、完成对话框的通用槽的功能。
编写QT-X11程序
进入QTforX11目录中进行设计
[root@vm-dev~]#cd/home/sprife/for_pc/
[root@vm-devfor_pc]#mkdirtestqt-x11//建立实验目录
[root@vm-devfor_pc]#cdtestqt-x11///打开文件夹
[root@vm-devtestqt-x11]#
使用designer编辑程序控件:
[root@vm-devtestqt-x11]#
/home/sprife/for_pc/qt-x11-opensource-src-4.4.0/bin/designer//运行QtDesigner
在弹出designer界面,可以看到在窗口左上方有一个“templates\forms”的菜单,下面有四个可供选择的模板。
第一个和第二个都是对话框,区别在于对话框中按钮的位置不同。
第三个是主窗口,第四个是窗口部件。
一般我们选择Widget就可以了。
选择一个窗口布局Widget点击->创建,如图4和图5:
图4
图5
拖拽几个简单的控件(TextEdit、PushBotton、TextLabel)进行界面设计,初始化控件及相关属性内容,如图6:
图6
建立信号与槽的连接,在弹出窗口中,show按钮与文本编辑框的连接clicked->clear,如图7:
图7
同样建立第二组信号与槽的连接,在弹出窗口,exit按钮与Form的连接licked->closed,图8:
图8
退出界面编辑保存为UI格式testx11.ui。
[root@vm-devtestqt-x11]#ls//查看文件夹下内容
testx11.ui
在/home/sprife/for_pc/testqt-x11路径下新建main.cpp文件。
编辑main.cpp函数:
[root@vm-devtestqt-x11]#vimain.cpp//打开文件
#include"ui_testx11.h"//界面文件生成的头文件
intmain(intargc,char*argv[])//程序入口
{
QApplicationapp(argc,argv);//创建QApplication类对象app
QWidget*widget=newQWidget;
Ui:
:
Formui;
ui.setupUi(widget);
widget->show();//显示
returnapp.exec();//退出
}
[root@vm-devtestqt-x11]#ls//查看文件夹内容
main.cpptestx11.ui
[root@vm-devtestqt-x11]#
编译程序生成工程文件.pro:
[root@vm-devtestqt-x11]#
/home/sprife/for_pc/qt-x11-opensource-src-4.4.0/bin/qmake-project
[root@vm-devtestqt-x11]#ls
testqt-x11.protestx11.uimain.cpp
编译生成Makefile文件:
[root@vm-devtestqt-x11]#
/home/sprife/for_pc/qt-x11-opensource-src-4.4.0/bin/qmake
[root@vm-devtestqt-x11]#ls
Makefiletestqt-x11.protestx11.uimain.cpp
编译生成可执行文件:
[root@vm-devtestqt-x11]#make
[root@vm-devtestqt-x11]#ls
main.cppmain.oMakefiletestqt-x11testqt-x11.protestx11.uiui_testx11.h
执行编译好的程序测试下观察效果,如图9
[root@vm-devtestqt-x11]#./testqt-x11
图9
(三)移植QT/E到ARM设备
编译QT/E环境
1、拷贝并解压QT/E库及触摸屏库到实验目录for_arm
#cd/home/sprife/
#mkdirfor_arm
#cdfor_arm
#cp/up-Star2410/gui/Qt/src/qt-embedded-linuxopensource-
src-4.4.0.tar.bz2./
#cp/up-Star2410/gui/Qt/src/tslib-1.4.tar.bz2./
#tarxjvfqt-embedded-linux-opensource-src-4.4.0.tar.bz2
#tarxjvftslib-1.4.tar.bz2
2、编译tslib1.4触摸屏库
#cdtslib-1.4
#vibuild.sh
修改该脚本文件为如下:
#/bin/sh
exportCC=arm-linux-gcc
./autogen.sh
echo"ac_cv_func_malloc_0_nonnull=yes">arm-linux.cache
./configure--host=arm-linux--cache-file=arm-linux.cache
-prefix=$PWD/../tslib1.4-install
make
makeinstall
退出保存后编译:
#./build.sh
3、编译QT/E库
#cd/home/sprife/qt4/for_arm/
#cp-atslib1.4-install/lib/*
qt-embedded-linux-opensource-src-4.4.0/lib/
#cp-atslib1.4-install/include/ts*
qt-embedded-linux-opensource-src-4.4.0/include/
#cdqt-embedded-linux-opensource-src-4.4.0
#./configure-embeddedarm-xplatformqws/linux-arm-g++-depths16-little-endian-qt-mouse-linuxtp-qt-mouse-tslib-I/home/sprife/qt4/for_arm/tslib1.4-install
/include–L/home/sprife/qt4/for_arm/tslib1.4-install/lib-prefix
/mnt/nfs/Trolltech/qt-embedded-4.4.0
#make
#makeinstall
编译QT/E程序到ARM设备上运行
在/home/sprife/路径下新建for_arm文件夹,将/home/sprife/for_pc/路径下testqt-x11文件夹拷贝到for_arm文件夹中。
编译QT/E程序:
#cd/home/sprife/for_arm///进入目标文件夹
#cp/home/sprife/for_pc/testqt-x11/.–arf//拷贝文件夹
#cdtestqt-x11/
#/home/sprife/for_arm/qt-embedded-linux-opensource-src-4.4.0/bin/qmake–project//编译程序生成工程文件.pro
#/home/sprife/for_arm/qt-embedded-linux-opensource-src-4.4.0/bin/qmake
//编译生成Makefile文件
#make//编译生成可执行文件
ARM端挂载mnt共享目录:
#mount–tnfs-onolock192.168.1.118:
/home/sprife/for_pc/testqt-x11/mnt
拷贝编译好的QT/E程序到QT4Embedded文件夹:
#cdQT4Embedded
#cp/mnt/testqt-x11./–arf
输入以下命令对相关环境参量进行修改:
up-tech:
~/QT4Embeded#viqtg4demo.sh
参量修改如下:
exportQTDIR=$PWD
exportLD_LIBRARY_PATH=$PWD/lib:
/lib
exportQTDIR=$PWD
exportTSLIB_TSDEVICE=/dev/event0
exportTSLIB_PLUGINDIR=$PWD/lib/ts
exportTSLIB_CONSOLEDEVICE=none
exportQT_TSLIBDIR=$PWD/lib
exportTSLIB_CONFFILE=$PWD/etc/ts.conf
exportPOINTERCAL_FILE=$PWD/etc/ts-calib.conf
exportQWS_MOUSE_PROTO=tslib:
/dev/event0
exportTSLIB_CALIBFILE=$PWD/etc/ts-calib.conf
exportQT_QWS_FONTDIR=$PWD/lib/fonts
exportLANG=zh_CN
exportQWS_DISPLAY="LinuxFb:
mmWidth160:
mmHeight120:
0"
/root/QT4Embeded/testqt-x11–qws//修改参量行
~
~
~
~
-qtg4demo.sh1/175%
查看、运行可执行文件:
up-tech:
~/QT4Embeded#ls
demoetclibpaiweiqtg4demo.shtestqt-x11
up-tech:
~/QT4Embeded#./qtg4demo.sh
执行文件后,开发板上可观察到与图9相同界面窗口,在触摸屏上点击show便可清除文本框内容(点击exit退出执行界面)。
三.技术实现问题
(一)通过FTP向开发板传送可执行文件
由于ARM端挂载mnt共享目录时常出现挂在不上的问题,我们采用以FTP上传的方式将可执行文件送到开发板,来达到同一目的。
首先,在Windows系统下,利用LeadFTP以登录名phy、密码123456登录虚拟机IP,选择路径,将编译生成的可执行文件下载到指定文件夹。
然后,再利用LeadFTP匿名登录开发板IP,将刚下载的可执行文件上传至pub文件夹中。
最后,再在Xshell上将pub中可执行文件拷贝到执行目录下运行。
拷贝语句如下:
#cd/QT4Embedded/
#cp/var/ftp/pub/testqt-x11./–arf
在这里还应注意,若pub文件夹下已有需上传的同名文件是不能够覆盖掉的,同时也不能直接在这里删除,文件的删除必须在Xshell下利用如下语句完成:
#cd/var/ftp/pub/
#rmtestqt-x11
删除完成后,重新上传即可。
(二)释放用户权限
在程序运行过程中,我们还遇到了用户权限不够的问题,在这里我们的解决方法是在Xshell下利用如下语句来对用户权限进行释放:
#chmod777testqt-x11
四.总结与体会
设计性实验报告成绩:
指导教师签名: