系统环境:ubuntu10.4
编译环境:arm-linux-gcc 3.4.1
以前刚开始接触qte移植的时候,思维特混乱,照着网上瞎捣鼓出来的。经过最近几天自己的不断尝试,总算明白了这是怎么回事,下面分享一下我的心得。
其实我们所说的移植qte4.5,就是将编译好后的lib放到与PC上路径一致的arm板中就行了。由于开发板容量有限,所有我们要尽可能的得到一个小的lib库。
我们可以在源码包下面
输入:./configure -help,最好能够好好看一下后面的注释,根据自己需要去掉不要的功能,这样就能减少lib库的大小了。
这个是我的配置
./configure -prefix /usr/local/qte/ -opensource -shared -fast -no-largefile -no-stl -no-xmlpatterns -no-phonon -no-svg -no-webkit -no-scripttools -no-sse -no-mmx -no-3dnow -no-sse -no-sse2 -no-gif -no-libtiff -no-libmng -no-libjpeg -no-openssl -no-qt3support -qt-sql-sqlite -make libs -nomake tools -nomake examples -nomake docs -nomake demos -no-feature-CURSOR -no-nis -no-cups -no-iconv -no-pch -no-dbus -reduce-relocations -xplatform qws/linux-arm-g++ -embedded arm -little-endian -depths 16,32 -no-qvfb -no-opengl -qt-gfx-linuxfb -no-gfx-multiscreen -no-gfx-vnc -no-gfx-transformed -no-gfx-qvfb -no-kbd-usb -no-kbd-tty -no-kbd-sl5000 -no-kbd-vr41xx -no-kbd-qvfb -no-glib -no-mouse-pc -no-mouse-bus -no-mouse-yopy -no-mouse-qvfb -no-mouse-vr41xx -no-mouse-tslib -qt-mouse-linuxtp
说一下几个比较重要的选项。
-prefix,这个指定你的qte安装在哪个目录下,若不指定,则默认安装在/usr/local/Trolltech/Qtexxx4.5.1或其它名字,一旦设置了这个路径,那么将来要在arm板上建立一个相同的路径,将编译好的Lib库拷贝到arm板上的/usr/local/qte/目录下,注意要库链接的拷贝。
-no-gfx-xx 这个选项比较重要,我的configure中显示地声明-no-gfx-linuxfb,因为arm板上使用的framebuffer。将其它的全都no掉了。qvfb是在PC机模拟使用的,我们用不着,至于其它几个更是用不着了。linuxfb一定不能no掉,不然qte程序运行时会提示找不到驱动。
-no-kbd-xx 如果用不到键盘的话,将kbd对应的全no掉把。
-no-mouse-xx 这个选项实在是很让人困扰,刚开始的时候我也是。这个选项的大概意思就是你要使用什么鼠标驱动来触发触摸屏的点击事件。qte4.5可以使用linuxTb,也可以使用tslib1.3 或tslib1.4,我就直接使用了linuxTb,再加上example/qws/mousecalibration目录下的校正程序,运行的也很不错。所以根本就没必要移植tslib。显示地声明-qt-mouse-linuxtp,-no-mouse-tslib,-mo-mouse-..,将其它的用不到的全no掉。如果有自己的鼠标驱动,那么在这个选项里就可以添加-qt-mouse-驱动名字。
按照这个configure;执行配置脚本内容。
在经过多次尝试以及查阅网上的资料后,得到了以下的一些经验,
打开qt-embedded-linux-opensourcesrc4.5.2/src/gui/embedded/qmouselinuxtp_qws.h
#define QT_QWS_IPAQ
#define QT_QWS_IPAQ_RAW
添加上述两个宏,从qmouselinuxtp_qws.cpp中的源码可以看出,若定义了上述的两个宏,将默认打开/dev/h3600_tsraw设备。而自己做的文件系统中可能只存在/input/ts0或者/ts0等相似设备,那么我们就要作一个软链接。从而使qte程序能够接收并响应触摸屏的点击事件。这两个宏在网上出现的频率很高,以前自己看的晕呼呼的,但现在结合源码看一看,原来就这么回事。
ln -s /dev/ts0 /dev/h3600_tsraw 创建一个h3600_rsraw到ts0的链接。h3600_rsraw假装成为触摸屏事件的设备,然后传递给qt程序。
qmouselinuxtp_qws.cpp中的部分源码
#if defined(QT_QWS_IPAQ)
# ifdef QT_QWS_IPAQ_RAW
mousedev = QLatin1String("/dev/h3600_tsraw");
# else
mousedev = QLatin1String("/dev/h3600_ts");
# endif
#else
mousedev = QLatin1String("/dev/ts");
#endif
} else {
mousedev = device;
}
注释掉qmouselinuxtp_qws.cpp中的一些代码,以免触摸屏上下和左右颠倒(我就碰到了这个问题)
//#ifdef QT_QWS_SHARP
// samples[currSample] = QPoint(1000 - data->x, data->y);
//#else
samples[currSample] = QPoint(data->x, data->y);
//#endif
及
//#if defined(QT_QWS_SCREEN_COORDINATES)
mousePos = handler->transform(mousePos);
//#endif
未经上述修改之前,出现了上下颠倒的情况,修改后成功!原来是触摸屏校正的问题,我还以为2440跑不起来qt4.5呢,运行速度还是可以的,好舒坦。
make,make install。
成功安装后,将lib库拷到文件系统的/usr/local/qte目录下,接下去就是声明环境变量了。
环境变量声明很简单,
echo "set ENV for qte"
export QTDIR=/usr/local/qte
export QWS_MOUSE_PROTO="LinuxTP:/dev/h3600_tsraw"
export QWS_DISPLAY="LinuxFB:mmWidth800:mmHeight480:0"
export QWS_SIZE=800x480
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QWS_MOUSE_PROTO="LinuxTP:/dev/h3600_tsraw" 这个QWS_MOUSE_PROTO比较让人困扰,第一个:前的东西对应你的鼠标驱动,我使用linuxtp所以是LinuxTP,对应的设备是h3600_tsraw;
QWS_SIZE和QWS_DISPLAY这两个呢,顾名思义就是在屏幕上显示的大小咯,根据自己的需要改。
如果选用tslib来校正,这个问题就要另外分析了,tslib会用到/dev/event0或者/dev/input/event0设备,那么就要写成export QWS_MOUSE_PROTO="Tslib:/dev/event0"
比较常见的tslib变量声明
echo "Set ENV for tslib......"
export TSLIB_ROOT=/usr/local/tslib
export TSLIB_TSDEVICE=/dev/event0 /*触摸屏设备*/
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
echo "set ENV for qte"
export QTDIR=/usr/local/qte
export QWS_DISPLAY=LinuxFb:mmWidth800:mmHeight480:0
export QWS_SIZE=800x480
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
xport QWS_MOUSE_PROTO="Tslib:/dev/event0"
继续回到我的LinuxTb吧,在qte目录下的example/qws/mousecalibration,将其编译为arm板上的程序,用这个程序来校正,然后运行自己的程序,一切正常,多尝试几次思路越来越清晰阿~~