- UID
- 1029342
- 性别
- 男
|
一、Qt/Embedded 开发环境的安装
一般来说,居于Qt/Embedded开发的应用程序最终会发布到安装有嵌入式Linux操作系统的小型设备上,所以使用装有Linux操作系统的PC机或者工作站来完成Qt/Embedded开发当然是最理想的环境,尽管Qt/Embedded也可以安装在Unix和Windows系统上。下面我们将介绍如何在一台装有Linux操作系统的机器上建立Qt/Embedded开发环境。首先,您需要拥有三个软件安装包:tmake工具安装包,Qt/Embedded 安装包,Qt的X11版的安装包。
由于上述这些软件安装包有许多不同的版本,您要注意由于版本的不同导致这些软件在使用时可能造成的冲突,为此我们将告诉您一些基本的安装原则:当您选择或下载了Qt/Embedded 的某个版本的安装包之后,您下一步要选择安装的Qt for X11的安装包的版本必须比您最先下载的Qt/Embedded 的版本要旧,这是因为Qt for X11的安装包的两个工具uic和designer产生的源文件会和Qt/Embedded的库一起被编译链接,本着“向前兼容”的原则, Qt for X11的版本应比Qt/Embedded的版本旧。
我们将以下面所列版本的安装包,一步一步介绍Qt/Embedded开发环境建立的过程(这
些软件可以免费从trolltech的WEB或FTP服务器上下载):
◆ tmake 1.11 或更高版本;(生成Qt/Embedded应用工程的Makefile文件)
◆ Qt/Embedded 2.3.7;(Qt/Embedded 安装包)
◆ Qt 2.3.2 for X11; (Qt的X11版的安装包, 它将产生x11开发环境所需要的两个工具)
1、安装tmake
在Linux 命令模式下运行以下命令:
tar xfz tmake-1.11.tar.gz
export TMAKEDIR=$PWD/tmake-1.11
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
export PATH=$TMAKEDIR/binPATH
2. 安装Qt/Embedded 2.3.7
在Linux 命令模式下运行以下命令:
tar xfz qt-embedded-2.3.7.tar.gz
cd qt-2.3.7
export QTDIR=$PWD
export QTEDIR=$QTDIR
export PATH=$QTDIR/binPATH
export LD_LIBRARY_PATH=$QTDIR/libLD_LIBRARY_PATH
./configure -qconfig -qvfb -depths 4,8,16,32
make sub-src
cd ..
上述命令 ./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 命令查看。
3. 安装Qt/X11 2.3.2
在Linux 命令模式下运行以下命令:
tar xfz qt-x11-2.3.2.tar.gz
cd qt-2.3.2
export QTDIR=$PWD
export PATH=$QTDIR/binPATH
export LD_LIBRARY_PATH=$QTDIR/libLD_LIBRARY_PATH
./configure -no-opengl
Make
make -C tools/qvfb
mv tools/qvfb/qvfb bin
cp bin/uic $QTEDIR/bin
cd ..
根据开发者本身的开发环境,也可以在configure 的参数中添加别的参数,比如-no-opengl 或-no-xfs,可以键入./configure -help 来获得一些帮助信息。
二、认识Qt/Embedded 开发环境
Qt/Embedded 的开发环境可以取代那些我们熟知的UNIX 和WINDOWS 开发工具。它提供了几个跨平台的工具使得开发变得迅速和方便,尤其是它的图形设计器。Unix 下的开发者可以在PC 机或者工作站使用虚拟缓冲帧,从而可以仿真一个和嵌入式设备的显示终端大小,象素相同的显示环境。嵌入式设备的应用可以在安装了一个跨平台开发工具链的不同的平台上编译。最通常的做法是在一个UNIX系统上安装跨平台的带有libc库的GNU c++编译器和二进制工具。在开发的许多阶段,一个可替代的做法是使用Qt的桌面版本,例如Qt/X11或是Qt/Windows来进行开发。这样开发人员就可以使用他们熟悉的开发环境,例如微软的Visual C++ 或者 Borland C++;在UNIX操作系统下,许多环境也是可用的,例如Kdevelop,它也支持交互式开发。如果Qt/Embedded 的应用是在UNIX 平台下开发的话,那么它就可以在开发的机器上以一个独立的控制台或者虚拟缓冲帧的方式来运行,对于后者来说,其实是有一个X11的应用程序虚拟了一个缓冲帧。通过指定显示设备的宽度,高度和颜色深度,虚拟出来的缓冲帧将和物理的显示设备在每个像素上保持一致。这样每次调试应用时开发人员就不用总是刷新嵌入式设备的FLASH 存储空间,从而加速了应用的编译、链接和运行周期。运行Qt 的虚拟缓冲帧工具的方法是:在Linux 的图形模式下运行命令:
qvfb (回车)
当Qt 嵌入式的应用程序要把显示结果输出到虚拟缓冲帧时,我们在命令行运行这个程序时,在程序名后加上-qws 的选项。例如: $> hello -qws
2.1 QT 的支撑工具
Qt 包含了许多支持嵌入式系统开发的工具,其中一些工具我们会在别的地方介绍。有两个最实用的工具(除了上面我们提到的虚拟缓冲帧)是 qmake 和Qt designer(图形设计器)。qmake 是一个为编译Qt/Embedded 库和应用而提供的Makefile 生成器。它能够根据一个工程文件(.pro)产生不同平台下的Makefile 文件。qmake 支持跨平台开发和影子生成(shadow builds),影子生成是指当工程的源代码共享给网络上的多台机器时,每台机器编译链接这个工程的代码将在不同的子路径下完成,这样就不会覆盖别人的编译链接生成的文件。qmake 还易于在不同的配置之间切换。开发者可以使用Qt 图形设计器可视化地设计对话框而不需编写一行代码。使用Qt图形设计器的布局管理可以生成具有平滑改变尺寸的对话框,qmake 和Qt 图形设计器是完全集成在一起的。
2.2 信号与插槽
信号与插槽机制提供了对象间的通信机制,它易于理解和使用,并完全被Qt 图形设计器所支持。图形用户接口的应用需要对用户的动作做出响应。例如,当用户点击了一个菜单项或是工具栏的按钮时,应用程序会执行某些代码。大部分情况下,我们希望不同类型的对象之间能够进行通信。程序员必须把事件和相关代码联系起来,这样才能对事件做出响应。以前的工具开发包使用的事件响应机制是易崩溃的,不够健壮的,同时也不是面向对象的。Trolltech 已经创立了一种新的机制,叫做“信号与插槽”。信号与插槽是一种强有力的对象间通信机制,它完全可以取代原始的回调和消息映射机制;信号与插槽是迅速的,类型安全的,健壮的,完全面向对象并用C++来实现的一种机制。
在以前,当我们使用回调函数机制来把某段响应代码和一个按钮的动作相关联时,我们通常把那段响应代码写成一个函数,然后把这个函数的地址指针传给按钮,当那个按钮被按下时,这个函数就会被执行。对于这种方式,以前的开发包不能够确保回调函数被执行时所传递进来的函数参数就是正确的类型,因此容易造成进程崩溃,另外一个问题是,回调这种方式紧紧的绑定了图形用户接口的功能元素,因而很难把开发进行独立的分类。Qt的信号与插槽机制是不同的。Qt的窗口在事件发生后会激发信号。例如一个按钮被点击时会激发一个“clicked”信号。程序员通过建立一个函数(称作一个插槽),对象1图一一些信号与插槽连接的抽象图然后调用connect()函数把这个插槽和一个信号连接起来,这样就完成了一个事件和响应代码的连接。信号与插槽机制并不要求类之间互相知道细节,这样就可以相对容易的开发出代码可高重用的类。信号与插槽机制是类型安全的,它以警告的方式报告类型错误,而不会使系统产生崩溃。
例如,如果一个退出按钮的clicked() 信号被连接到了一个应用的退出函数-
信号1
信号2
插槽1
插槽2
插槽1
插槽2
插槽3
插槽1
信号1
信号1
对象3
对象4
connect( 对象1, 信号1, 对象2, 插槽1 )
connect( 对象1, 信号1, 对象2, 插槽2 )
connect( 对象1, 信号2, 对象4, 插槽1 )
connect( 对象3, 信号1, 对象4, 插槽3 )
对象2
quit() 插槽。那么一个用户点击退出键将使应用程序终止运行。上述的连接过程用代码写出来就是这样connect( button, SIGNAL(clicked()), qApp, SLOT(quit()) );我们可以在Qt应用程序的执行过程中增加或是减少信号与插槽的连接。信号与插槽的实现扩展了C++的语法,同时也完全利用了C++面向对象的特征。信号与插槽可以被重载或者重新实现,它们可以定义为类的公有,私有或是保护成员。 |
|