嵌入式工具Qt的安装与使用

时间:2020-12-03 21:06:50

 Qt是Trolltech公司的一个产品。Trolltech是挪威的一家软件公司,主要开发两种产品:一种是 跨平台应用程序界面框架;另外一种就是提供给做嵌入式Linux开发的应用程序平台,能够应用到PDA和各种移动设备上。Qt和Qtopia分别是其中具 有代表性的两个。

Qt是一个多平台的C++图形用户界面应用程序框架,它能给用户提供精美的图形用户界面所需要的所有元素,而且它是基于一种面向对象的思想,所以用户对其对象的扩展是相当容易的,并且它还支持真正的组件编程。

QT与QT/E以及QT3与QT4之间的区别
相对来说QT与QT/E的语法一样,所不同之处在库类大小或者库类函数大小不同而已。QT/E相对于QT来说,不具有少数类或者少数函数的支持。具体QT/E是否包含某个类或者包含某个类中的函数,我的方法是在QT/E安装目录下的include文件夹中去查找。
QT3和QT4有很多不同点,主要不同也是在于库类以及支持函数有所变化,比如,有些QT3中的函数,在QT4中被其他函数名所代替,因此很多QT4程序在QT3环境下无法执行。QT/E2.3.7与QT3基本相同,除了我前面提到的QT与QT/E的差别。

Qt是Linux桌面环境KDE的基础。笔者认为,可以说Qt与Windows下的Mfc的实质是一样的,所以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;
◆ Embedded—带FramBuffer的Linux平台。

QT/E下载地址为:ftp://ftp.rediris.es/mirror/Qt/source/
Tmake下载地址为:ftp://ftp.trolltech.com/freebies/tmake/

下载Qt
在TrollTech网站http://www.trolltech.com/developer/ 上搜索下载Qt的相关包,包括
qt-embedded-free-3.3.4.tar.gz
qt-x11-opensource-src-4.2.3.tar.gz
tmake-1.8.tar.gz #可以不要,因为有现在这些高版本的qt-embedded,qt-x11,qtopia里就有qmake
这 些都是最新的Qt版本,编译过程好像跟查资料时的老版本的步骤有很大的不同,比如新版本使用qmake而不像以前使用tmake,还有configure 脚本文件配置时的参数有许多变化,编译时没有什么资料可以查,除了trolltech本身的一些文档,剩下的只好自己摸索了。


下面简单介绍一下Qt/Embedded和Qtopia在Linux上的安装和使用,还有在开发过程中可能碰到的一些问题。

一、概念:

QT/E:是QT专为嵌入式系统设计的一个GUI,它是直接对显存操作的,不需要,X11的图象库的支持。

QT/X11:是QT为LINUX平台的PC机的GUI,它需要X11等几个库的支持。

QT/WIN:为windows下的

三种的源代码是相同的(这只是理想情况下,换了平台,代码多少肯定是要改写的)。

Qtopia(QPE):是一个针对PDA的嵌入式桌面,包含了一系列的应用程序,同时可以将自己的QT程序放到QPE里面,通过点击鼠标或触摸屏允许程序。

Qt 和Qtopia的安装
如果需要安装一个带FramBuffer的Qtopia平台,需要有以下软件(所列举软件以笔者使用的为例):
◆ Qtopia 1.6.0;
◆ Tmake 1.11(或更高版本)软件包(主要用来生成Qt/Embedded应用工程的Makefile文件)
◆ Qt/Embedded 2.3.7(Qtopia 1.6.0是基于该开发平台上开发的);
◆ Qt/Embedded 2.3.2 for X11; (Qt的X11版的安装包, 它将产生x11开发环境所需要的两个工具)

需要注意的是,由于上述软件安装包有许多不同的版本,由于版本的不同可能会造成潜在的冲突而影响使用,一个基本的原则是:选择的Qt for X11的安装包应该比Qt/Embeedded的安装版本要旧,这是由于Qt for X11安装包的两个工具uic和designer产生的的源文件会和Qt/Embedded的库一起被编译链接,也就是考虑到“向前兼容”的原则。

目前,Qt/Embedded可以运行在inux所支持的各种处理器上,包括像Intel X86、ARM、MIPS和PowerPC等处理器上。Qt/Embedded对内存的消耗很低,因为它不需要X服务器或是Xlib库,可以直接的写缓冲帧,对于不使用的功能可以在编译的时候动态调节从而尽可能的减少对内存的使用,例如,在实际使用过程当中不想使用QlistView这个库,可以通过定义一个QT_NO_LISTVIEW的预处理标记来实现。它甚至可以把全部的应用功能编译链接到一个简单的静态链接的可执行程序中。Qt/Embedded提供了大约200多个可配置的特征,在Intel X86平台上库的大小范围会在700KB到5000KB之间。

在Trolltech公司的网站上可以下载该公司所提供的Qt/Embedded的免费版本。

Qtopia平台安装分为以下几个步骤:

*****x86下编译QTE 建立/home/software/x86-qt目录


1. 安装Tmake
Tmake是一个Makefile文件生成器,如果不编自己的应用程序,这一步可以省略。
在Linux命令模式下运行以下命令:

tar -xzf tmake-1.11.tar.gz

export TMAKEDIR=/home/software/x86-qt/tmake-1.11

export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++

export PATH=$TMAKEDDIR/bin:$PATH


2. 安装Qt/X11 2.3.2

在Linux命令模式下运行以下命令:

tar -xzf qt-x11-2.3.2.tar.gz

cd /home/software/x86-qt/qt-2.3.2

export QT2DIR=/home/software/x86-qt/qt-2.3.2

export QTDIR=$QT2DIR

export PATH=$QT2DIR/bin:$PATH

export LD_LIBRARY_PATH=$QT2DIR/lib:$LD_LIBRARY_PATH

echo yes | ./configure –no-xft -platform linux-g++

make

make -C $QT2DIR/tools/qvfb //产生qvfb,是一个模拟显存平台。

make -C $QT2DIR/tools/designer

cp $QT2DIR/tools/qvfb/qvfb bin

cp $QT2DIR/tools/designer/designer bin

cp $QT2DIR/bin/uic $QTEDIR/bin //QT/E中没有UIC,把它拷过去。

cd ..

./configure -no-xft 这一句在优龙文档里是没有-no-xfs后缀的,但是没有的话会报错,因此加上了-no-xft后缀,编译顺利通过。如果不想加这个后缀,则拷贝 /qt-2.3.7/src/3rdparty/freetype/include/freetype文件夹到/qt-x11-2.3.2/lib目录下 即可。

make -C /public/qt-x11-2.3.2/tools/qvfb 这一句在优龙的文档里是这样的make -C tools/qvfb 经试验发现这样编译通不过,只有输入绝对路径才可以。

根据开发者本身的开发环境,也可以在configure的参数中添加别的参数,比如-no-opengl或-no-xft,可以键入./configure -help来获得一些帮助信息。

根据我的理解,没必要在./configure后加太多的参数,因为qt-x11-2.3.2和qt-2.3.7是差不 多的, 编译qt-x11-2.3.2的目的就是生成designer和uic和qvfb,虽然qt-2.3.7也可以生成qvfb和designer,但考虑到 向下兼容的原则,用2.3.2生成的designer设计出来的程序2.3.7的库一定可以支持。

如果Qt/Embedded 的应用是在UNIX 平台下开发的话,那么它就可以在开发的机器
上以一个独立的控制台或者虚拟缓冲帧的方式来运行,对于后者来说,其实是有一个X11
的应用程序虚拟了一个缓冲帧。通过指定显示设备的宽度,高度和颜色深度,虚拟出来
的缓冲帧将和物理的显示设备在每个像素上保持一致。这样每次调试应用时开发人员就
不用总是刷新嵌入式设备的FLASH 存储空间,从而加速了应用的编译、链接和运行周期。

编译Qt/X11的唯一目的就是为编译QTE提供uic(用户接口编译器)以及基于X Windows系统的FrameBuffer设备模拟器qvfb。当然,如果已经有了这两个工具,再编译Qt/X11就多此一举了。
Because we need the execution file "uic" .
uic用来把.ui文件转换成.h和.cpp文件.
uic是for x86的文件

运行Qt 的虚拟缓冲帧工具的方法是:在Linux 的图形模式下运行命令:qvfb & (回车)

当Qt 嵌入式的应用程序要把显示结果输出到虚拟缓冲帧时,我们在命令行运行这
个程序时,在程序名后加上-qws 的选项。例如: $> ./hello –qws

3. 安装Qt/Embedded2.3.7

在终端下运行以下命令:

tar zxf qt-embedded-2.3.7.tar.gz

cd /home/software/x86-qt/qt-2.3.7

export QTEDIR=/home/software/x86-qt/qt-2.3.7

export PATH=$QTEDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTEDIR/bin:$LD_LIBRARY_PATH

export QTDIR=$PWD

cp ../qconfig-local.h /home/software/x86-qt/qt-2.3.7/src/tools

echo yes |./configure -platform linux-x86-g++ -shared -gif -sm -thread -system-zlib -system-libpng -system-libmng -system-jpeg -no-xft -qconfig local -depths 4,8,16,32

make

cp $QT2DIR/bin/uic $QTEDIR/bin

cd ..

cp $QPEDIR/src/qt/qconfig-local.h src/tools/ 这一句可能会提示文件找不到,这是因为qconfig-local.h没有在 /src/qt的目录下,也没有这个目录,在优龙提供的源代码里有qconfig-local.h这个配置文件,将其拷贝到 qt-2.3.7/src/tools中即可。Qconfig-local.h是优龙针对自己的开发板弄的配置文件,主要是支持触摸屏的。在x86下不用 触摸屏,也可以不用这一行。

如果实在没有这个文件,可以不用cp 这一行,并且将下面一句./configure –qconfig local -qvfb -depths 4,8,16,32改为 ./configure -qconfig -qvfb -depths 4,8,16,32即可。

上述命令./configure -qconfig -qvfb -depths 4,8,16,32 指定Qt 嵌入式开发包生成虚拟缓冲帧工具qvfb,并支持4,8,16,32 位的显示颜色深度。另外也可以在configure 的参数中添加-system-jpeg 和gif,使Qt/Embedded 平台能支持jpeg、gif格式的图形。

命令make sub-src指定按精简方式编译开发包,也就是说有些Qt 类未被编译。Qt嵌入式开发包有5种编译范围的选项,使用这些选项,可控制Qt生成的库文件的大小,但是您的应用所使用到的一些Qt类将可能因此在Qt的库中找不到链接。编译选项的具体用法可运行./configure -help命令查看。

编译QT/E后会产生几个库文件,在x86下编译的库文件支持x86下的应用程序调试。库文件在/lib目录下。

4.编译QPE 安装Qtopia
cd qtopia-1.7.x
export QTDIR=$QTEDIR
export QPEDIR=$PWD

export PATH=$QPEDIR/bin:$PATH

cd src

./configure

make
cd ../..
搞完了这几步,你应该会看到写结果,允许qvfb &,再允许qpe,如果看到了QPE的桌面,那么恭喜你,你成功了。

至此,QT/EMBEDDED for x86开发环境安装完成

****************************************************

注:交叉编译QTE只需将linux-x86-g++改为linux-arm-g++即可,并且不用编译qt-x11-2.3.2,


好了,有了前面的基础,我们在来高ARM底下的开发环境,就很easy了
1.编译QT/E(for ARM
mkdir qt-arm;

cd qt-arm //(提醒你)建一个专门针对ARM 的目录,免得跟以前的混了
tar xfz qt-embedded-2.3.7.tar.gz
cd qt-2.3.7
export QTDIR=$PWD
export QTEDIR=$QTDIR
cp /your dir/qconfig-local.h ./src/tools //这是个配置好的编译选项文件
make clean //先清理干净
./configure –xplatform linux-arm-g++ -shareddebug –qconfig local –qvfb -depths 4,8,16,32
make sub-src
cd ..

这一句使编译后得到的库文件libqte.so.2.3.7大小为20.5M,如果使用./configure –xplatform linux-arm-g++ –qconfig local -depths 4,8,16,32 得到的库文件为5.6M

有朋友反映说qt生成的库太大,原因是加了-debug的原因,默认是不加的,加这一句意味这生成的库中带有调试信息,调试信息占了很大的空间。
OK,这样就建立了ARM 的QTE库,

注意,ARM的交叉编译器要是3.3.2以上的咯)。
库文件放在/lib 目录下,生成的是针对arm处理器的库,将来要烧入到板子上的

2.编译qtopia for arm
cd qtopia-1.7.x
export QTDIR=$QTEDIR //make需要QTEDIR/bin目录下的uic文件
export QPEDIR=$PWD
export PATH=$QPEDIR/bin:$PATH
qembed –images $QPEDIR/pics/inline/*.* > $QPEDIR/src/libraries/qtopia/inlinepics_p.h
//这一步是制作自己的图标文件。不加自己的图标可以不要这一步 //这也是qt3的工具
cd src
./configure –platform linux-arm-g++
make
cd..



Qt和Qt Designer的使用

根据上面的步骤安装完成了Qt/Embedded和Qtopia之后,就可以运行这些程序了。

运行Qt的虚拟仿真窗口:在Linux的图形模式下运行命令qvfb&;Qtopia只是一个用Qt/Embedded开发的程序,运行Qtopia,在图形模式下运行命令:


export QTDIR=$QTEDIR,
qpe &;

这样Qtopia的程序就运行在QVFB上,即Qt的虚拟仿真窗口。

Qt/Embedded是针对嵌入式Linux而开发的一种开发工具,Qt封装了一些常用的类,而且这些类的名字都以Q字开头命名,如QString、QDialog等。这里主要介绍一下如何利用Qt Designer来设计组件,并生成相应的代码。

在Qt中,把组件分为复合体、原始体和配件。而在Qt中,组件是由一些抽象类、复杂的组件类、管理组件几何特性的类等组成。

Qt中有三个主要的基类:QObject、Qapplication和QWidget。

在Qt 中编程,利用Signal和Slot进行对象之间的通信是Qt的主要特征。它与Windows中的消息机制非常类似,但是Signal和Slot机制真正 实现了一种消息的封装。当对象的状态改变时,发出Signal,通知所有的Slot接受Signal,尽管它不知道哪些函数是Slot,Slot一开始也 不知道哪些Signal可以接收。Signal和Slot之间不是一一对应的关系,一个Signal可以发给多个Slot, Slot也可以接收多个Signal。Slot除了可以接收Signal以外,与其它的成员函数没有区别。这种机制比使用回调函数要灵活,但是会减慢程序 的运行速度。不过在现在高速CPU的面前,这种损失是无足轻重的,而且它还能保证程序的简明性和灵活性,非常便利。

在Qt的组件中,不仅定义了常用的成员变量和成员函数,还定义了所有与该组件相关的Signal和Slot。

要将组件组合起来,最简单的方法就是使用Qt Designer。首先要启动Qt Designer,在Linux命令模式下,键入以下命令(假设Qt安装在/usr/local下):


cd qt-2.3.2/bin
./designer




这样就可以启动一个与Windows下的Delphi相类似的如图1的界面。


然 后新建一个QFrame,将自己需要的组件直接拖拉到这个Frame中,相信很多人都有过这样的经历,此处就不再详细描述了。完成之后存盘时,会将这个新 的组件保存为一个扩展名为.ui的文件。假设所存的文件名为test.ui,用vi test.ui来查看这个文件,发现这是一个用xml语言写的一个文本。下面用这个test.ui生成相应的test.h和test.cpp。同样还是在 这个目录下,可以看到一个uic的工具,这个是Qt专门用来将ui文件生成.h和.cpp文件的,在终端模式下键入以下命令:


./uic -o test.h test.ui
./uic -o test.h -i test.cpp test.ui

此 时就能看到生成了相应test.h和test.cpp,这是一个类。当然这只是一些表面的东西,还需要在这些代码中添加相应的Signal和Slot,完 成所需要的操作。值得注意的是,相应版本生成的ui最好用相应版本的uic来生成代码。如果用Qt 3.1.2的Designer生成的ui,用Qt 2.3.2的uic来生成代码,生成的代码都会是一些空函数。

在一般的开发过程中,首先通过这个ui生成的一个类,在Qt中通常叫做 Base,如上面的例子,叫做testBase;然后再新建一个类,来继承这个Base。通常叫做实现类Impl,如testImpl。在这个实现类里面 定义所需要的成员函数、Signal和Slot,因为ui可能是经常需要改动的。如果这样做,每次只需要在Designer中修改ui,而不用去理会这些 成员函数、Signal和Slot了。

编译一个Qt程序必然需要Makefile,在Qt中提供了一个专门生成Makefile的工具,就是tmake。用tmake需要根据编写的程序写一个.pro文件。.pro文件非常简单,有固定的格式,下面是一个例子:


TEMPLATE = app
CONFIG = qtopia warn_on release
MOC_DIR =tmp
OBJECTS_DIR =tmp
HEADERS =fcrs.h/
structs.h /
globalfunc.h /
globalvars.h /
testimpl.h
SOURCES = main.cpp /
globalfunc.cpp/
globalvars.cpp /
testimpl.cpp
INTERFACES = test.ui /
TARGET = fcrs

生成这个.pro文件之后,在终端中键入下面的命令:

tmake -o Makefile test.pro


就自动生成了一个Makefile,使用这个Makefile编译所编写的程序就可以了。