一、Qt简介
Qt工具包是一个跨平台的C++开发工具。Qt被主要用在了KDE桌面环境的开发中。它是挪威Trolltech公司的产品,2008年6月17日被芬兰的诺基亚(Nokia)公司收购,以增强该公司在跨平台软件研发方面的实力。
使用Qt开发的软件,可以在任何支援的平台上编译与执行,而不需要修改源代码。可以实现本平台的图形界面风格,也可实现其它平台的图形界面风格。比如您可以在Microsoft Windows平台下编译出具有苹果公司Mac OS图形界面风格的应用程序。
同时,经过多年发展,Qt不但拥有了完善的C++图形库,而且近年来的版本逐渐整合了数据库、OpenGL库、多媒体库(Phonon)、网络库、脚本库、XML库、WebKit库等等,其核心库也加入了进程间通信、多线程等模块,极大的丰富了Qt开发大规模复杂跨平台应用程序的能力,真正意义上实现了其研发宗旨“Code Less; Create More; Deploy Anywhere.”。
Qt中使用了C++的非标准扩展,用在编译前增加一个名为moc的预处理器来实现,moc将Qt代码处理成标准C++代码。
Qt开放源代码,并且提供自由软件的用户协议。使得它可以被广泛地应用在各平台上的开放源代码软件开发中。
其官方网站为:http://www.qtsoftware.com/
二、Qt的授权模式
1.商业版:开发的软件是专属的或商业的,源代码不共享。
2.开源版:遵循GNU GPL v.3.0,发布的程序也必须是基于GPL的。Qt 4.5.0 及以后的版本开始遵循 GNU LGPL v.2.1。
三、Qt的平台支持
Qt 的版本是按照不同的图形系统来划分的,目前分为五个版本:
Win: 适用于Miccrosoft Windows
X11: 适合于使用了x系统的各种 linux 和 unix的平台
Mac: 适合于苹果Mac OS X
embedded-linux: 适合于具有帧缓冲(frame buffer)的linux 的平台
embedded-wince: 适合于Windows CE
四、Qt各软件版本的区别
1. Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等。由于Qt最早是在Linux中随着KDE流行开来的,因此通常很多人说的Qt都指用于Linux/Unix的Qt/X11。
2. Qt/E(Qt/Embedded)最初是用于嵌入式Linux系统的Qt版本。Qt/E去掉了X Lib的依赖而直接工作于Frame Buffer上,因而效率更高。
3. Qtopia最初是sourceforge.net上的一个开源项目,全称是Qt Palmtop Environment (QPE),是一个构建于Qt/E之上的类似桌面系统的应用环境,包括了PDA和手机等掌上系统常见的功能如电话簿、日程表等。相比之下,Qt/E是基础类库。在QT4版本前要安装Qtopia需要先装Qt/E,但之后的就不需要了。版本4之后的Qtopia 已经带有QT/E库了。
4. Qtopia Core:就是原来的Qt/E,从Qt 4开始改名为Qtopia Core,把Qtopia Core并到Qtopia的产品线中去了。在版本4之前,Qte和Qtopia是不同的两套程序,Qte是基础类库,Qtopia是构建于Qte之上的一系列应用程序。但从版本4开始,Trolltech将Qte并入了Qtopia,并推出了新的Qtopia4。在该版中,原来的Qte被称为Qtopia Core,作为嵌入式版本的核心,既可以与Qtopia配合,也可以独立使用。原来的Qtopia则被分成几层,核心的应用框架和插件系统被称为 Qtopia Platform,上层的应用程序则按照不同的目标用户分为不同的包,如Qtopai PDA,Qtopia Phone。但实际上Qtopia Core就相当于原来的Qt/E,仍然作为基础类库。从Qt4.4开始,其名称又改回Qt-embedded了,之前的Qtopia改名为Qt Extended了。其线路为Qt/E->Qtopia Core->Qt-embedded。
5. Qt-all是qt的所有版本的源代码了,既可以编译成Linux版本也可以编译成Windows版本。
6. Qt Extended(2008年9月30日前称Qtopia)是一个软件平台,主要用于采用嵌入式Linux系统的(embedded Linux-based system)的电子手机和移动电话。从4.4版本开始,Qtopia改名为Qt Extended,qt-embedded-4.4.x相当于qtopia-core,qt-extended相当于桌面。2009年3月3日,Qt Software宣布将停止开发作为独立产品的 Qt Extended。取而代之的是,Qt Extended 中的一些功能将被转入 Qt 框架,从而使 Qt 成为更加丰富的跨平台应用程序框架。Qt Extended 的最后一个版本是4.4.3。
Wednesday, May 6, 2009
qte4编译
原先的板子一直用的都是qte4.3.4版本的库,现在要换成qte4.4.3的。今天又尝试重新编译了一下。
一.qt-embedded-linux-opensource-src-4.4.3
1. cd qt-embedded-linux-opensource-src-4.4.3
2. ./configure -prefix $PWD/build -release -shared -fast -pch -no-qt3support -qt-sql-sqlite -no-libtiff -no-libmng -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -no-openssl -nomake examples -nomake demos -nomake tools -optimized-qmake -no-phonon -no-nis -no-opengl -no-cups -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-xkb -no-sm -no-xinerama -no-xshape -no-separate-debug-info -xplatform qws/linux-arm-g++ -embedded arm -depths 16 -no-qvfb -qt-gfx-linuxfb -no-gfx-qvfb -no-kbd-qvfb -no-mouse-qvfb -qt-kbd-usb -confirm-license -qt-mouse-tslib
configure完后会在当前目录下生成config.status文件,里面记录了编译时使用的参数。
configure支持的参数及其意义可以通过./configure --help来查看。
这里使用tslib做为qt鼠标的驱动,需要修改mkspecs/qws/linux-arm-g++/qmake.conf文件:
QMAKE_INCDIR = /home/lcc/project/qt/tslib-1.4/build/include
QMAKE_LIBDIR = /home/lcc/project/qt/tslib-1.4/build/lib
否则会出现"The tslib functionality test failed!"错误。这个错误还有另外一种解决办法就是在configure的时候增加-I和-L参数,qte4.3.4就采用了这种方法。
3. make
4. make install
二.qtopia-core-opensource-src-4.3.4
1. cd qtopia-core-opensource-src-4.3.4
2. ./configure -prefix $PWD/build -release -shared -fast -pch -no-qt3support -qt-sql-sqlite -no-libtiff -no-libmng -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -no-openssl -nomake examples -nomake demos -nomake tools -no-nis -no-opengl -no-cups -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-xkb -no-sm -no-xinerama -no-xshape -no-separate-debug-info -xplatform qws/linux-arm-g++ -embedded arm -depths 16 -no-qvfb -qt-gfx-linuxfb -no-gfx-qvfb -no-kbd-qvfb -no-mouse-qvfb -qt-kbd-usb -confirm-license -qt-mouse-tslib -I/home/lcc/project/qt/tslib-1.4/build/include -L/home/lcc/project/qt/tslib-1.4/build/lib
需要注意qte4.3.4配置时比qte4.4.3少了两个参数-optimized-qmake -no-phonon。
qte4.3.4不支持-no-phonon这个参数,这个参数的意义是不编译Phonon模块。如果加上的话会出现这个错误:
-no-phonon: invalid command-line switch
-qt-gfx-linuxfb: unknown argument
-no-gfx-qvfb: unknown argument
-no-kbd-qvfb: unknown argument
-no-mouse-qvfb: unknown argument
-qt-kbd-usb: unknown argument
-qt-mouse-tslib: unknown argument
后面几个参数本来是没什么问题的,在此捎带着也受牵连了。
qte4.3.4支持-optimized-qmake这个参数,但是加上这个参数之后在configure的时候会出现一堆segmentation fault,这个问题也有可能是我的环境有问题?不知道有没有人碰到过。
3. make
4. make install
ps: 如果前一次configure成功,可以make confclean然后重新configure。但是如果前一次configure失败了,最好是删掉整个目录重新解压再configure。
ps2:注意系统中gcc版本的高低以及交叉编译链的版本,否则会出现问题。系统gcc的版本不能太低。在gcc3.2.2@redhat9里编译qt-embedded-linux-opensource-src-4.4.3就出现了一些很奇怪的问题。
一.qt-embedded-linux-opensource-src-4.4.3
1. cd qt-embedded-linux-opensource-src-4.4.3
2. ./configure -prefix $PWD/build -release -shared -fast -pch -no-qt3support -qt-sql-sqlite -no-libtiff -no-libmng -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -no-openssl -nomake examples -nomake demos -nomake tools -optimized-qmake -no-phonon -no-nis -no-opengl -no-cups -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-xkb -no-sm -no-xinerama -no-xshape -no-separate-debug-info -xplatform qws/linux-arm-g++ -embedded arm -depths 16 -no-qvfb -qt-gfx-linuxfb -no-gfx-qvfb -no-kbd-qvfb -no-mouse-qvfb -qt-kbd-usb -confirm-license -qt-mouse-tslib
configure完后会在当前目录下生成config.status文件,里面记录了编译时使用的参数。
configure支持的参数及其意义可以通过./configure --help来查看。
这里使用tslib做为qt鼠标的驱动,需要修改mkspecs/qws/linux-arm-g++/qmake.conf文件:
QMAKE_INCDIR = /home/lcc/project/qt/tslib-1.4/build/include
QMAKE_LIBDIR = /home/lcc/project/qt/tslib-1.4/build/lib
否则会出现"The tslib functionality test failed!"错误。这个错误还有另外一种解决办法就是在configure的时候增加-I和-L参数,qte4.3.4就采用了这种方法。
3. make
4. make install
二.qtopia-core-opensource-src-4.3.4
1. cd qtopia-core-opensource-src-4.3.4
2. ./configure -prefix $PWD/build -release -shared -fast -pch -no-qt3support -qt-sql-sqlite -no-libtiff -no-libmng -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -no-openssl -nomake examples -nomake demos -nomake tools -no-nis -no-opengl -no-cups -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-xkb -no-sm -no-xinerama -no-xshape -no-separate-debug-info -xplatform qws/linux-arm-g++ -embedded arm -depths 16 -no-qvfb -qt-gfx-linuxfb -no-gfx-qvfb -no-kbd-qvfb -no-mouse-qvfb -qt-kbd-usb -confirm-license -qt-mouse-tslib -I/home/lcc/project/qt/tslib-1.4/build/include -L/home/lcc/project/qt/tslib-1.4/build/lib
需要注意qte4.3.4配置时比qte4.4.3少了两个参数-optimized-qmake -no-phonon。
qte4.3.4不支持-no-phonon这个参数,这个参数的意义是不编译Phonon模块。如果加上的话会出现这个错误:
-no-phonon: invalid command-line switch
-qt-gfx-linuxfb: unknown argument
-no-gfx-qvfb: unknown argument
-no-kbd-qvfb: unknown argument
-no-mouse-qvfb: unknown argument
-qt-kbd-usb: unknown argument
-qt-mouse-tslib: unknown argument
后面几个参数本来是没什么问题的,在此捎带着也受牵连了。
qte4.3.4支持-optimized-qmake这个参数,但是加上这个参数之后在configure的时候会出现一堆segmentation fault,这个问题也有可能是我的环境有问题?不知道有没有人碰到过。
3. make
4. make install
ps: 如果前一次configure成功,可以make confclean然后重新configure。但是如果前一次configure失败了,最好是删掉整个目录重新解压再configure。
ps2:注意系统中gcc版本的高低以及交叉编译链的版本,否则会出现问题。系统gcc的版本不能太低。在gcc3.2.2@redhat9里编译qt-embedded-linux-opensource-src-4.4.3就出现了一些很奇怪的问题。
Tuesday, May 5, 2009
tslib的编译
tslib在用户层对触摸屏的数据进行滤波、去抖、校准等,同时提供给应用程序统一的接口。常见的GUI,如Qt,MiniGUI等一般都支持tslib接口。
首先在编译tslib之前需要确保安装了autoconf, automake, libtool这几个工具,否则会在编译的时候报错。错误信息如下:
1、如果autoconf和automake未安装,对于tslib-1.4会指示无法识别autogen.sh文件第4行的autoreconf指令。
2、如果未安装libtool工具,则会提示
Can't exec "libtoolize": No such file or directory at /usr/bin/autoreconf line 186.
Use of uninitialized value $libtoolize in pattern match (m//) at /usr/bin/autoreconf line 186.
configure.ac:25: error: possibly undefined macro: AC_DISABLE_STATIC
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure.ac:26: error: possibly undefined macro: AC_ENABLE_SHARED
configure.ac:27: error: possibly undefined macro: AC_LIBTOOL_DLOPEN
configure.ac:28: error: possibly undefined macro: AC_PROG_LIBTOOL
autoreconf: /usr/bin/autoconf failed with exit status: 1
因此,可以在以下步骤之前先执行以下两条指令:
apt-get install autoconf automake
apt-get install libtool
一、tslib-1.3
1. cd tslib-1.3
2. export PREFIX=$PWD/build
3. export CC=arm-linux-gcc
4. ./autogen.sh
5. ./configure --host=arm-linux --prefix=$PREFIX --cache-file=arm-linux.cache --enable-inputapi=no
6. vi plugins/Makefile
将LDFLAGS :=$(LDFLAGS) -rpath $(PLUGIN_DIR)修改为
LDFLAGS :=$(LDFLAGS) -rpath `cd $(PLUGIN_DIR) && pwd`
如果没有此步骤,在make的时候会出现libtool:link: only absolute run-paths are allowed错误
7. make
8. make install
二、tslib-1.4
1. cd tslib-1.4
2. ./tslib-compile.sh
将tslib-1.4的编译过程写成脚本tslib-compile.sh 以方便编译。
附: tslib-compile.sh
export PREFIX=$PWD/build
export CC=arm-linux-gcc
#/*
# *autogen.sh is an important .sh file£?it produce ./configure file according to current env setting
# */
./autogen.sh
echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
#/*(it is better to see what parameter that the ./configure program take,use "./configure --help")
# *you can add "--enable-debug"([default=no]),and/or "--enable-static"([default=no])
# */
./configure --host=arm-linux --prefix=$PREFIX --cache-file=arm-linux.cache --enable-inputapi=no
make
make install
ps: 需要注意系统使用的libtool的版本不能太低,可以使用libtool --version查看。如在Red Hat 9里面的libtool版本为1.4.3,编译tslib-1.3没问题,但是编译tslib-1.4时会出现错误:
configure.ac:57: error: possibly undefined macro: AS_HELP_STRING
测试环境:
VMware 5.5.1 & Ubuntu 8.10 & arm-linux-gcc-3.4.6-glibc-2.3.6 & libtool 2.2.4
首先在编译tslib之前需要确保安装了autoconf, automake, libtool这几个工具,否则会在编译的时候报错。错误信息如下:
1、如果autoconf和automake未安装,对于tslib-1.4会指示无法识别autogen.sh文件第4行的autoreconf指令。
2、如果未安装libtool工具,则会提示
Can't exec "libtoolize": No such file or directory at /usr/bin/autoreconf line 186.
Use of uninitialized value $libtoolize in pattern match (m//) at /usr/bin/autoreconf line 186.
configure.ac:25: error: possibly undefined macro: AC_DISABLE_STATIC
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure.ac:26: error: possibly undefined macro: AC_ENABLE_SHARED
configure.ac:27: error: possibly undefined macro: AC_LIBTOOL_DLOPEN
configure.ac:28: error: possibly undefined macro: AC_PROG_LIBTOOL
autoreconf: /usr/bin/autoconf failed with exit status: 1
因此,可以在以下步骤之前先执行以下两条指令:
apt-get install autoconf automake
apt-get install libtool
一、tslib-1.3
1. cd tslib-1.3
2. export PREFIX=$PWD/build
3. export CC=arm-linux-gcc
4. ./autogen.sh
5. ./configure --host=arm-linux --prefix=$PREFIX --cache-file=arm-linux.cache --enable-inputapi=no
6. vi plugins/Makefile
将LDFLAGS :=$(LDFLAGS) -rpath $(PLUGIN_DIR)修改为
LDFLAGS :=$(LDFLAGS) -rpath `cd $(PLUGIN_DIR) && pwd`
如果没有此步骤,在make的时候会出现libtool:link: only absolute run-paths are allowed错误
7. make
8. make install
二、tslib-1.4
1. cd tslib-1.4
2. ./tslib-compile.sh
将tslib-1.4的编译过程写成脚本tslib-compile.sh 以方便编译。
附: tslib-compile.sh
export PREFIX=$PWD/build
export CC=arm-linux-gcc
#/*
# *autogen.sh is an important .sh file£?it produce ./configure file according to current env setting
# */
./autogen.sh
echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
#/*(it is better to see what parameter that the ./configure program take,use "./configure --help")
# *you can add "--enable-debug"([default=no]),and/or "--enable-static"([default=no])
# */
./configure --host=arm-linux --prefix=$PREFIX --cache-file=arm-linux.cache --enable-inputapi=no
make
make install
ps: 需要注意系统使用的libtool的版本不能太低,可以使用libtool --version查看。如在Red Hat 9里面的libtool版本为1.4.3,编译tslib-1.3没问题,但是编译tslib-1.4时会出现错误:
configure.ac:57: error: possibly undefined macro: AS_HELP_STRING
测试环境:
VMware 5.5.1 & Ubuntu 8.10 & arm-linux-gcc-3.4.6-glibc-2.3.6 & libtool 2.2.4
Monday, May 4, 2009
非编码矩阵键盘扫描算法
一、键盘可分为独立连接式和矩阵式两种
1、独立连接式键盘每一个按键占用一个I/O引脚。优点是结构简单,使用方便;缺点是随着按键数的增加,被占用的I/O口线也将增加。所以不适合在按键较多的情况下使用。如图1所示。
2、矩阵式键盘适合采用动态扫描的方式进行识别。优点是节省端口,缺点是编程麻烦。适合按键较多的场合。如图2所示。

单键行扫描方式的代码如下:
//single key scan function
void KeyScan()
{
U8 data=0xFF;
U8 tmp=0xFF;
U8 line,row;
int i=0,j=0;
unsigned char SendBuffer[2];
SetDataLow(0xFF); //set line high level
tmp = GetDataLow(); //get the key
if(0xFF!=tmp)
{
Delay(100);
tmp = GetDataLow();
if(tmp==0xFF) //avoid dithering
{
//putchar(0x99);
return;
}
line = CheckBit(~tmp);
for(i=0; i<8; i++) //scan begin here
{
SetDataLow(i);
data = GetDataLow(); //get the key
if(data == tmp)
{
row=i;
break;
}
else
{
}
}
SendKeyDownCode(KeyMap[line][row]);
while(0xFF!=GetDataLow()); //wait until this key is up
SendKeyUpCode(KeyMap[line][row]);
}
}
1、独立连接式键盘每一个按键占用一个I/O引脚。优点是结构简单,使用方便;缺点是随着按键数的增加,被占用的I/O口线也将增加。所以不适合在按键较多的情况下使用。如图1所示。
2、矩阵式键盘适合采用动态扫描的方式进行识别。优点是节省端口,缺点是编程麻烦。适合按键较多的场合。如图2所示。

图1 独立式键盘


图2 矩阵式键盘
二、矩阵式键盘又可以分为编码式键盘和非编码式键盘
1、编码键盘能够由硬件自动提供与被按键对应的ASCII码或其它编码。内部设有键盘编码器,能识键、生成键码、去抖、防串键。
2、非编码键盘则仅提供行和列的矩阵,其硬件逻辑与按键编码不存在严格的对应关系,而要由所用的程序来确定。通常只提供键盘矩阵,按键的识别、键码的提供由软件来完成。
1、编码键盘能够由硬件自动提供与被按键对应的ASCII码或其它编码。内部设有键盘编码器,能识键、生成键码、去抖、防串键。
2、非编码键盘则仅提供行和列的矩阵,其硬件逻辑与按键编码不存在严格的对应关系,而要由所用的程序来确定。通常只提供键盘矩阵,按键的识别、键码的提供由软件来完成。
三、非编码矩阵键盘扫描
对于编码式键盘,可以直接通过其预留的接口读取按键值即可。对于非编码式矩阵键盘,需要自己扫描得到按键的值,通常采用的方法是行扫描法和线反转法两种方法。
(1)行扫描法
行列扫描法可以分两步:
step 1.判断是否有按键按下进行全扫描,将所有行线置成低电平;然后扫描全部列线,如果扫描的列值全是高电平,则说明没有任何一个键被按下;如果读入的列值不是全1,则说明有键按下。在只有单键的情况并可以得到列线值。
step 2.判断那一行的按键被按下用逐行扫描的方法确定哪一个键被按下。先扫描第一行,即置该行为低电平,其他行为高电平,然后检查列线,如果某条列线为低电平,则说明第一行与该列相交的位置上的按键被按下;如果所有列线全是高电平,则说明第一行没有键被按下,接着扫描第二行,以此类推,直到找到被按下的键。
(2)线反转法
线反转法需要两步:
step 1.将列线作为输出线,行线作为输入线。置输出线全部为0,此时行线中呈低电平0的为按键所在行,如果全部都不是0,则没有按键按下。
step 2.将行线作为输出线,列线作为输入线。置输出线全部为0,此时列线呈低电平的为按键所在的列。这样,就可以确定了按键的位置(X,Y)。
四、行扫描法和线反转法的区别
1、线反转法需要接键盘的IO口必须是双向的,而行扫描法列线输入,行线输出,单向IO就可以完成。
2、线反转法要求键盘的两端都上拉(如图3所示),如果IO可以支持内部上拉模式的话可以在软件上设置寄存器开启上拉模式(对于Atmega8需要设置DDRxn,PORTxn,PUD(SFIOR))。而行扫描法只需要列线上拉就可以了。
图3
单键行扫描方式的代码如下:
//single key scan function
void KeyScan()
{
U8 data=0xFF;
U8 tmp=0xFF;
U8 line,row;
int i=0,j=0;
unsigned char SendBuffer[2];
SetDataLow(0xFF); //set line high level
tmp = GetDataLow(); //get the key
if(0xFF!=tmp)
{
Delay(100);
tmp = GetDataLow();
if(tmp==0xFF) //avoid dithering
{
//putchar(0x99);
return;
}
line = CheckBit(~tmp);
for(i=0; i<8; i++) //scan begin here
{
SetDataLow(i);
data = GetDataLow(); //get the key
if(data == tmp)
{
row=i;
break;
}
else
{
}
}
SendKeyDownCode(KeyMap[line][row]);
while(0xFF!=GetDataLow()); //wait until this key is up
SendKeyUpCode(KeyMap[line][row]);
}
}
Subscribe to:
Comments (Atom)