目 录
第一章 LINUX图形用户界面GUI介绍 .......................................................................................................................................... 2 1.1常用GUI介绍 ............................................................................................................................................................................ 3 1.2关于QT ....................................................................................................................................................................................... 4 1.3 QT/EMBEDDED简介 .................................................................................................................................................................... 5 第二章 QT的安装 .............................................................................................................................................................................. 7 2.1设置环境变量 ............................................................................................................................................................................. 8 2.2 使用脚本ARM-BUILD 编译QT .................................................................................................................................................. 9 第三章 QT的编程 .............................................................................................................................................................................. 9 3.1 QT/EMBEDDED 开发一个嵌入式应用的过程 .......................................................................................................................... 10 3.2 “HELLO”QT的初探 ................................................................................................................................................................... 10 3.2.1 建立工程文件 ................................................................................................................................................................... 10 3.2.2 产生源代码 ....................................................................................................................................................................... 16 3.2.3 添加main.cpp文件 .......................................................................................................................................................... 17 3.2.4修改hello.pro文件 ........................................................................................................................................................... 18 3.2.5 生成 MakeFile 文件........................................................................................................................................................ 19 3.2.6 修改 hello.cpp 文件 ........................................................................................................................................................ 20 3.3 将HELLO 移植到JXARM9-2410实验箱上 ........................................................................................................................... 26 3.3.1 重新生成修改 Makefile ................................................................................................................................................... 26 3.3.2 制作启动器 ....................................................................................................................................................................... 32 3.3.3 重新生成cramfs文件 ...................................................................................................................................................... 34 3.3.4 烧写重新生成的cramfs文件到JXARM9-2410实验箱 ................................................................................................. 34
第一章 Linux图形用户界面GUI介绍
所谓GUI(Graphics User Interface)就是图形用户界面。图形用户界面的广泛流行时当今计算机技术的重大成就之一,它极大的方便了非专业用户的使用,人们不需要死记硬背大量的命令,而可以通过窗口,菜单方便的操作。
随着手持式设备的硬件条件的提高,嵌入式系统对轻量级GUI的需求越来越迫切。近来的市场需求显示,越来越多的嵌入式系统,包括PDA、机顶盒、DVD/VCD播放机、WAP 手机等等系统均要求提供全功能的Web浏览器。这包括HTML 4.0的支持、JavaScript的支持,甚至包括Java虚拟机的支持。而这一切均要求有一个高性能、高可靠的GUI的支持。另外,在工业实时控制系统中对GUI的要求也越来越高。目前许多这类系统采用比较简单的手法实现GUI。但是,在出现Linux系统之后,许多工业控制系统开始采用Linux作为操作系统,并在其上加入GUI实现。
嵌入式GUI就是在嵌入式系统中为特定的硬件设备或环境而设计的图形用户界面系统。所以嵌入式GUI在实际应用中,有如下基本要求:
轻型,占用源少
高性能
高可靠性
可配置
2
1.1常用GUI介绍
1.Linux下的GUI – X Window
X Window是Linux以及其他类UNIX系统的标准GUI。X Window系统采用标准的客户/服务器体系结构,具有可扩展性好、可移植性好等优点。但该系统的庞大、累赘和低效率也是大家所共知的。
为了获得应用程序的可移植性,许多厂家都试图通过对X Window系统的紧缩开发,使之能够在嵌入式系统上运行。国外已经开发出了大小约为800K的X服务器。这对西方国家来说基本能够满足嵌入式系统的需求了。但该系统的源代码尚不开放,从而很难进行本地化开发。
2.Linux下的GUI – MicroWindows
MicroWindows是一个开放源码的项目,目前由美国一家公司在主持开发。该项目的开发非常活跃,国内也有人参与了其中的开发,并编写了GB2312等字符集的支持。
该项目的主要特色在于提供了比较完善的图形功能,包括一些高级的功能,比如Alpha混合,三维支持,TrueType字体支持等。但作为一个窗口系统,该项目提供的窗口处理功能还需要进一步完善,比如控件或构件的实现还很不完备,键盘和鼠标等的驱动还很不完善。
3.Linux下的GUI – OpenGUI
OpenGUI在Linux系统上存在已经很长时间了。最初的名字叫FastGL,只支持256
3
的线性显存模式。但目前也支持其他显示模式。这个库是用C++编写的,只提供C++接口。
4.Linux下的GUI – MiniGUI
MiniGUI是一种面向嵌入式系统或者实时系统的图形用户界面支持系统。它主要运行于Linux控制台,实际可以运行在任何一种具有POSIX线程支持的POSIX兼容系统上。
MiniGUI同时也是国内最早出现的几个自由软件项目之一。是由中国人开发的GUI。
5.Linux下的GUI – QT/Embedded
QT/Embedded是著名的QT库开放商正在进行的面向嵌入式系统的QT版本。这个版本的主要特点是可移植性较好,许多基于QT的X Window程序可以非常方便地移植到嵌入式版本。但是该系统不是开放源码的,如果你要使用这个库,可能需要支付昂贵的授权费用。
1.2关于Qt
Qt 是 Trolltech 公司的一个标志性产品。Trolltech 公司 1994 年成立于挪威,但是公司的核心开发团队已经在 1992年开始了Qt产品的研发,并于 1995年推出了Qt的第一个商业版,直到现在Qt 已经被世界各地的跨平台软件开发人员使用,而 Qt 的功能也得到了不断的完善和提高。
Qt 是一个支持多操作系统平台的应用程序开发框架,它的开发语言是 C++。
4
Qt 最初主要是为跨平台的软件开发者提供统一的,精美的图形用户编程接口,但是现在它也提供了统一的网络和数据库操作的编程接口。正如微软当年为操作系统提供了友好,精致的用户界面一样,今天由于 Trolltech 的跨平台开发框架Qt 的出现,也使得UNIX、LINUX 这些操作系统以更加方便、精美的人机界面走近普通用户。
Qt 是以工具开发包的形式提供给开发者的,这些工具开发包包括了图形设计器,Makefile制作工具,字体国际化工具,Qt的C++类库等等。Qt 的类库也是等价于 MFC 的开发库,但是 Qt 的类库是支持跨平台的类库
Qt支持的操作系统平台:
◆ MS/Windows 95、Windows 98、WindowsNT 4.0、Windows 2000、Windows XP
◆ Unix/X11 Linux、Sun Solaris、HP-UX、Compaq True64Unix、IBM AIX、SGI IRIX和很多其它 X11平台
◆ Macintoshi Mac OSX
◆ 嵌入式的,包含有FramBuffer的 Linux平台
1.3 Qt/Embedded简介
Qt/Embedded 是一个为嵌入式设备上的图形用户接口和应用开发而订做的C++工具开发包. 它通常可以运行在多种不同的处理器上部署的嵌入式Linux操作系统上
5
除了类库以外,Qt/Embedded还包括了几个提高开发速度的工具,使用标准的Qt API,我们可以非常熟练的在Windows和Unix编程环境里开发应用程序。
Qt/Embedded 是一组用于访问嵌入式设备的 Qt C++ API;Qt/Embedded 的Qt/X11, Qt/Windows 和Qt/Mac版本提供的都是相同的API和工具。Qt/Embedded还包括类库以及支持嵌入式开发的工具。
Qt/Embedded提供了一种类型安全的被称之为信号与插槽的真正的组件化编程机制,这种机制和以前的回调函数有所不同。 Qt/Embedded还提供了一个通用的widgets类,这个类可以很容易的被子类化为客户自己的组件或是对话框。针对一些通用的任务,Qt还预先为客户定制了像消息框和向导这样的对话框。
Qt/Embedded包括了它自身的窗口系统,并支持多种不同的输入设备。
Qt的图形设计器(designer)可以用来可视化地设计用户接口,设计器中有一个布局系统,它可以使你设计的窗口和组件自动根据屏幕空间的大小而改变布局。开发者可以选择一个预定义的视觉风格,或是建立自已独特的视觉风格。使用UNIX/LINUX操作系统的用户,可以在工作站上通过一个虚拟缓冲帧的应用程序仿真嵌入式系统的显示终端。
Qt/Embedded也提供了许多特定用途的非图形组件,例如国际化,网络和数据库交互组件。
Qt/Embedded是成熟可靠的工具开发包,它在世界各地被广泛使用。除了在商业上的许多应用以外,Qt/Embedded还是为小型设备提供的Qtopia应用环境的基础。
6
Qt/Embedded以简洁的系统,可视化的表单设计和详致的API让编写代码变得愉快和舒畅。
第二章 Qt的安装
一般来说, 居于Qt/Embedded开发的应用程序最终会发布到安装有嵌入式Linux操作系统的小型设备上。
需要的软件包:
tmake工具安装包(生成Qt/Embedded应用工程的Makefile文件)
Qt/Embedded 安装包(Qt/Embedded 安装包)
Qt的X11版的安装包(Qt的X11版的安装包, 它将产生x11开发环境所需要的两个工具)
公司提供的软件包如下:
7
2.1设置环境变量
在PC的Linux的终端执行如下命令,然后打开gedit编译器后,修改内容如下红色部分所示:
#gedit /etc/ld.so.conf
/home/cvtech/jx2410/qt2410/arm/qt/lib
/home/cvtech/jx2410/qt2410/arm/qtopia/lib
/usr/kerberos/lib
8
/usr/X11R6/lib
/usr/lib/sane
/usr/lib/qt-3.1/lib
/usr/lib/mysql
/usr/lib/qt2/lib
2.2 使用脚本arm-build 编译Qt
这里假设以上的软件包已经全部拷贝到PC的Linux中,且存放目录为:/home/cvtech/jx2410/qt2410/
在PC的Linux的终端执行如下命令:
# cd /home/cvtech/jx2410/qt2410/
# ./arm-build,然后就开始编译Qt了。
注意:这里我使用的是Redhat9.0,然后是完全安装的,RedHat9.0完全安装大概需要4.8G的空间,如果不完全安装会导致编译出错,原因是缺少必要的库导致的。
第三章 Qt的编程
9
3.1 Qt/Embedded 开发一个嵌入式应用的过程
选定嵌入式硬件平台
在工作的机器上安装 Qt/Embedded工具开发包
根据目标硬件平台,交叉编译 Qt/Embedded 的库
在工作的机器上进行应用程序的编码,调试
根据目标硬件平台,交叉编译嵌入式应用
在嵌入式硬件设备上调试运行应用
发布嵌入式应用
3.2 “hello”Qt的初探
第一次Qt程序实现一个功能,就是按下我们设置的user按钮后,显示出“hello cvtech”的打印信息,按下close按钮后,退出该应用程序。
3.2.1 建立工程文件
在PC的Linux的“/home/cvtech/jx2410/examples/qt/”目录下新建一个名为:“hello”的目录,命令如下:
10
# cd /home/cvtech/jx2410/examples/qt/
# mkdir hello
建立工程文件hello.pro,命令如下:
# progen –t app.t –o hello.pro
在后台启动QT的设计器,命令如下:
# /home/cvtech/jx2410/qt2410/arm/qt/bin/designer &
新建项目文件,选择工具栏File —> new —>Dialog ,然后点击OK 按钮,结果如下:
11
设置Form1的属性,修改“name” 为 hello,修改“caption”为 Hello Cvtech。
然后添加两个按钮, 分别修改“name”分别为 obutton 和 cbutton,修改
“text”分别为open 和 close。
然后在添加一个text图标完成后,如图:
,修改“name”为 Tlabel,修改“text”为空。设置
12
完成以上工作后,我们需要添加函数,使按钮能够对其进行响应,方法如下:选择工具栏中的 Edit —>slot,新建两个函数,分别为 open() 和 close(),如图所示:
13
下面的操作涉及到了QT中的信号和槽的概念,我的理解按钮的操作时信号,槽就是该操作所响应的函数。如下图所示,完成open 按钮和 close按钮的链接。
首先点击按钮,然后点住open按钮不要松开,向上拉动到Form1的空白地方,
如图:
同样的方法建立close按钮的响应关联,如图:
14
然后在Edit —>slot 中去除 close()函数,如图:
15
完成以上操作后,保存图形文件,点击工具栏File —> save,如图:
然后退出设计器。
注意:每次修改*.ui的工程文件后,必须使用下面的方法重新生成源码,否则会出现编译出错的情况。
3.2.2 产生源代码
在PC的Linux的终端中,输入命令如下:
# /home/cvtech/jx2410/qt2410/arm/qt/bin/uic –o hello.h hello.ui
# /home/cvtech/jx2410/qt2410/arm/qt/bin/uic –o hello.cpp -impl hello.h hello.ui
16
3.2.3 添加main.cpp文件
在PC的Linux的终端中,输入命令如下:# vi main.cpp
代码如下所示:
#include \"hello.h\"
#include #define QT_NO_WIZARD int main(int argc, char **argv) { 17 QApplication a(argc,argv); hello dlg; a.setMainWidget(&dlg); dlg.show(); return a.exec(); } 3.2.4修改hello.pro文件 在PC的Linux的终端中,输入命令如下:# vi hello.pro 修改内容如下: TEMPLATE = app CONFIG = qt warn_on release HEADERS = hello.h 18 SOURCES = hello.cpp \\ main.cpp INTERFACES = 3.2.5 生成 MakeFile 文件 在PC的Linux的终端中,输入命令如下: # qmake hello.pro 此时得到的Makefile 文件编译出来的 hello,是在PC 的Linux 上可以运行的。# make 得到可执行文件 hello ,在PC的Linux的终端中,输入命令如下: 19 # ./hello 得到界面如下: 3.2.6 修改 hello.cpp 文件 为了实现前面讲到的按下open按钮,出现“hello cvtech”的打印信息,我们还需要修改hello.pro文件,以下为源码内容: /**************************************************************************** ** Form implementation generated from reading ui file 'hello.ui' ** ** Created: Thu Nov 12 10:38:17 2009 20 ** by: The User Interface Compiler (uic) ** ** WARNING! All changes made in this file will be lost! ****************************************************************************/ #include \"hello.h\" #include #include #include #include #include #include /* * Constructs a hello which is a child of 'parent', with the 21 * name 'name' and widget flags set to 'f' * * The dialog will by default be modeless, unless you set 'modal' to * TRUE to construct a modal dialog. */ hello::hello( QWidget* parent, const char* name, bool modal, WFlags fl ) : QDialog( parent, name, modal, fl ) { if ( !name ) setName( \"hello\" ); resize( 312, 280 ); setCaption( tr( \"Hello Cvtech\" ) ); cButton = new QPushButton( this, \"cButton\" ); 22 cButton->setGeometry( QRect( 180, 190, 91, 31 ) ); cButton->setText( tr( \"close\" ) ); oButton = new QPushButton( this, \"oButton\" ); oButton->setGeometry( QRect( 40, 190, 91, 31 ) ); oButton->setText( tr( \"open\" ) ); TLabel = new QLabel( this, \"TLabel\" ); TLabel->setGeometry( QRect( 30, 60, 250, 51 ) ); QFont TLabel_font( TLabel->font() ); TLabel_font.setPointSize( 30 ); TLabel->setFont( TLabel_font ); TLabel->setText( tr( \"\" ) ); // signals and slots connections connect( oButton, SIGNAL( clicked() ), this, SLOT( open() ) ); 23 connect( cButton, SIGNAL( clicked() ), this, SLOT( close() ) ); } /* * Destroys the object and frees any allocated resources */ hello::~hello() { // no need to delete child widgets, Qt does it all for us } /* * Main event handler. Reimplemented to handle application * font changes */ 24 bool hello::event( QEvent* ev ) { bool ret = QDialog::event( ev ); if ( ev->type() == QEvent::ApplicationFontChange ) { QFont TLabel_font( TLabel->font() ); TLabel_font.setPointSize( 30 ); TLabel->setFont( TLabel_font ); } return ret; } void hello::open() { TextLabel1->setText(tr(\"Hello Cvtech!\")); 25 //qWarning( \"hello::open(): Not implemented yet!\" ); } 在上面的open()函数中添加了对按下open按钮响应的处理功能,即按下按钮后,打印出“Hello Cvtech!”这句话到主界面中。修改完成后保存,重新编译# make 再次执行# ./hello 按下open按钮,结果如图: 3.3 将hello 移植到JXARM9-2410实验箱上 3.3.1 重新生成修改 Makefile 因为是要在实验箱上运行,那么编译器也必须是交叉编译,就需要新的Makefile文件。使用tmake 产生 Makefile,在PC的Linux终端中输入命令: 26 # tmake –o Makefile hello.pro 修改Makefile文件如下: CC = /usr/local/arm/2.95.3/bin/arm-linux-gcc CXX = /usr/local/arm/2.95.3/bin/arm-linux-g++ QTDIR = /home/cvtech/jx2410/qt2410/arm/qt QPEDIR = /home/cvtech/jx2410/qt2410/arm/qtopia CFLAGS = -pipe -Wall -W -O2 -DNO_DEBUG CXXFLAGS= -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -DNO_DEBUG INCPATH = -I$(QTDIR)/include -I$(QPEDIR)/include LINK = /usr/local/arm/2.95.3/bin/arm-linux-g++ LFLAGS = LIBS = $(SUBLIBS) -L$(QTDIR)/lib -L$(QPEDIR)/lib -L/usr/local/arm/2.95.3/lib -lqte -lqpe -lqtopia -lm 27 MOC = $(QTDIR)/bin/moc UIC = $(QTDIR)/bin/uic TAR = tar -cf GZIP = gzip -9f ####### Files HEADERS = hello.h SOURCES = hello.cpp \\ main.cpp OBJECTS = hello.o \\ main.o INTERFACES = UICDECLS = UICIMPLS = 28 SRCMOC = moc_hello.cpp OBJMOC = moc_hello.o DIST = TARGET = hello INTERFACE_DECL_PATH = . ####### Implicit rules .SUFFIXES: .cpp .cxx .cc .C .c .cpp.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .cxx.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .cc.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< 29 .C.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .c.o: $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< ####### Build rules all: $(TARGET) $(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) moc: $(SRCMOC) tmake: Makefile Makefile: hello.pro tmake hello.pro -o Makefile dist: 30 $(TAR) hello.tar hello.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST) $(GZIP) hello.tar clean: -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET) -rm -f *~ core ####### Sub-libraries ###### Combined headers ####### Compile hello.o: hello.cpp \\ hello.h main.o: main.cpp \\ hello.h moc_hello.o: moc_hello.cpp \\ 31 hello.h moc_hello.cpp: hello.h $(MOC) hello.h -o moc_hello.cpp 修改完成后保存,重新编译# make,得到新的hello,这时候用 ./hello 是不能运行的,因为我们的编译器是arm的编译器。下面我们需要把我们得到的 hello 放到实验箱的QT中去运行。 3.3.2 制作启动器 注意:这里用到的QT的文件系统是光盘中flashupdate下的prog..cramfs 文件。首先我们需要把它解压缩,在PC的Linux的命令如下: # cp /home/cvtech/jx2410/root/prog.cramfs /root # cd /root # mkdir qtc # mount -t cramfs -o loop prog.cramfs qtc # cp qtc qt -rf # cp qt /home/cvtech/jx2410/root -rf 32 现在这个qt 目录就是我们需要修改的文件系统。 # cd /home/cvtech/jx2410/root/qt 拷贝一个启动器,修改为我们需要的启动器,命令如图: # cd qtopia/apps/Applications/ # cp worldtime.desktop hello.desktop # chmod 777 * # vi hello.desktop 修改 hello.pro 如下: [Desktop Entry] Comment=Hello Cvtech Exec=hello Icon=CityTime Type=Application 33 Name=Hello Cvtech Name[no]=Verdensur Name[de]=Weltzeituhr 保存以后,然后拷贝hello 到 应用程序文件夹,在PC的Linux的终端输入命令如下: # cd ../../bin # cp /home/cvtech/jx2410/examples/hello/hello . 3.3.3 重新生成cramfs文件 在PC的Linux的终端输入命令如下: # cd /home/cvtech/jx2410/root # ./mkfs.cramfs qt qtcramfs 新生成的qtcramfs就是我们要烧写的QT文件。 3.3.4 烧写重新生成的cramfs文件到JXARM9-2410实验箱 将qtcramfs 拷到U 盘当中,然后将U盘插到实验箱的HOST1口。 34 连接串口,启动实验箱的Linux操作系统,在终端中输入如下命令: $mount /dev/sda1/ /mnt/udisk $imagewrite /dev/mtd/4 -part 0 $imagewrite /dev/mtd/4 /mnt/udisk/qtcramfs:0 35 因篇幅问题不能全部显示,请点此查看更多更全内容