Qt-X11/QtEmbedded/Qtopia及其他常见包的关系? build Qtopia时经常能看到以下的包: qt-x11-2.3.2 qt-x11-3.3.x qte-2.3.x qtopia-2.x tmake-1.3 qmake, uic, moc ... 其中Qtopia编译依赖Qte; qt-x11-2.3只与编译一些tool有关, 如uic,moc,qvfb..Qtopia并不依赖qt-x11; qt -x11-3.3.x用来编译qtopia desktop(qtopia与桌面同步的工具)和i18n相关的lupdate、lrelease工具,所以如果你configure qtopia的时候没有加-no-qtopiadesktop选项或者用到了-languages参数就得准备qt-x11-3.x了; 另外在phone版本中有一个modem模拟的工具叫做phonesim, 也依赖qt-x11-3.x编译,不过多数人是用不上的, 呵呵。 tmake用于生成Makefile文件, 用在qte应用上; qmake包含在qtopia里, 用于为Qtopia应用生成Makefile文件; uic, moc,qvfb,qmake,tmake和designer使用的时候要注意版本,2.x, 3.x, 4.x之间是不兼容的,但相同主版本号之间是兼容的,所以我们在build Qtopia过程中经常从qt-x11-2.3中拷贝现成的uic和moc供qte使用。 编译过程中出现一些头文件找不到, 类未定义等等,很多时候是因为误使用了系统默认搜索路径下的uic等工具造成的。大家要注意这个问题 Qtopia/QtEmbedded版本对应关系? Qtopia1.7.0 / Qte 2.3.7 Qtopia2.1.1 / Qte 2.3.10 Qtopia2.1.2 / Qte 2.3.11 Qtopia2.2.0 / Qte 2.3.12 (包含在qtopia2.2源码包中) Qtopia/QtEmbedded相关源码包下载地址? Qt/Qte: ftp://ftp.trolltech.com/qt/source ftp://ftp.qtopia.org.cn/mirror/ftp.trolltech.com/qt/source Qtopia(1.6-2.2): ftp://ftp.trolltech.com/qtopia/source ftp://ftp.qtopia.org.cn/mirror/ftp.trolltech.com/qtopia/source tmake: ftp://ftp.trolltech.com/freebies/tmake ftp://ftp.qtopia.org.cn/mirror/ftp.trolltech.com/freebies/tmake 我的Qt/Embedded程序中的中文字符为什么显示成方块? 两个可能的原因: 一是qte的库未编译进对中文textcodec的支持, 解决方案:修改qconfig-qpe.h, 去掉CODEC有关的宏, 重新configure和make。 二是程序中选用的字体不是中文字体(默认的字体是Helvetica,没有中文), 需要在程序中指定一个中文字体,如qte自带的unifont(这个字体大家普遍的看法是看上去像残废), qt4版本里新加入了文泉驿的unicode字体,可以在源码包里找到,比较漂亮, 推荐。 如何把Qt/Embedded程序移植为Qtopia程序? Qtopia里提供了简单的宏来创建主窗口、应用style等, 最主要的改变在main函数。 参考qtopia/src/applications/clock/main.cpp -------------------------------------------------- #include "mymainwindow.h" #include <qtopia/qpeapplication.h> QTOPIA_ADD_APPLICATION("myappname", "MyMainWindow") QTOPIA_MAIN --------------------------------------------------- 这一步很简单把,cp过来改改类名和binary的名字就OK了。 需要注意的是你的mainwindow的构造函数要符合(QWidget*p, const char* name, int f)的形式(三个参数) 相应的,修改pro文件。 参考qtopia/src/applications/clock/clock.pro 其中最重要的一行是 CONFIG+= qtopiaapp 这样编出来是quicklaunch插件程序(applications目录下的程序默认config是quichlaunch, 别的目录不是哦~) 要想编成独立的应用, 加上这句:CONFIG -= buildQuicklaunch 大功告成! 如何将自己的应用添加到qtopia桌面里? 首先把你的应用修改成qtopia应用程序(见上一个问题)。 然后把你的程序cp到qtopia程序默认的搜索路径中: 应用程序放到SRCDIR/qtopia/image/opt/Qtopia/bin下;(后面的SRCDIR/qtopia/image/opt/Qtopia简写为"...") quicklaunch插件放到../plugins/application下。 假设你编译得到的quicklauncher插件叫libmybin.so, 则相应的需要在../bin下建立一个链接文件: ln -s quicklauncher mybin 另外,还需要创建一个desktop文件(找个现成的改改), 把这个desktop文件放到qtopia的 ../apps/Applications下。 desktop 文件里最重要的信息是关联的执行档名称和图标文件的名称。 执行档名称和上文中的mybin对应,图标的话desktop文件里只写了一个文件的名字,但实际上qtopia去搜索的时候会到以执行档的名字命名的子目录去寻找该icon文件,也就是.../pics/mybin/xxx.png。 以上环境都弄好后, 你进到Applications页面里就能看见自己的应用程序了。 在qtopia1.7 版本里对图标文件的处理略有不同, 默认的图标搜索主要是两个位置,一个是内嵌图标, 也就是用qembed工具生成的inlinepics_p.h,另外 就是pics目录下的文件。 如果在inline头文件里没有找到对应的图标数组,则会在pics目录下搜索。 其他好像差不多。 如何设置Qtopia的字体? 2.x系列版本在运行时的$HOME/Settings/下有个qpe.conf文件,其中的[Apperance]下的FontFamily字段设置字体,FontSize设置字号。 Qtopia 和Qte程序都会在运行时的$QTDIR/lib/fonts目录里搜索字体, 所以你要用的字体也要放在这个地方。另外还要根据需要修改该目录下的fontdir文件。这个文件是字体(FontFamily, FontSize...)与实际的字体文件的映射,要写正确才能找到字体文件, 所以不可马虎。 为什么QtEmbedded自带的例子无法编译通过? 在编译例子的时候经常会出现这样的提示信息,无法编译: “#make Some of the required modules (full-config) are not available. Skipped.” 这是怎么回事呢? 我想大家应该知道qte的库可以通过修改qconfig来增删一些特性吧, 也就是说通过定义一些宏可以去掉qte库包含的class定义,以减小qte库的大小。 所以说不同的config下编译出来的qte库多数情况下是不兼容的。 大家可以从该例子的.pro文件中获得一些信息(比如aclock这个例子),在pro文件中往往会有这么一行: REQUIRES+=full-config 这句话表明,这个qte应用用到的类只有在full-config才能满足。 所以如果你用的是别的config选项干脆就不让你编译。如果你非要编译也不是不可能,把这个限制去掉重新生成Makefile就可以了,不过很可能会出现undefined reference或者找不到类之类的错误, 大家要做好心理准备...... 要想成功编译qte的例子还有个方法是用-qconfig all参数configure QtEmbedded, 这样qte库包含所有的特性, 肯定什么例子都能编过去。 如何裁减QtEmbedded库? QtEmbedded定义了一系列的features, 用 #ifndef NO_XXX #endif 的方式把特性相关的代码包围在特定的宏里,这样如果定义了某个NO_XXX的宏,就是去掉了该特性, 从而达到减少编译的代码,进而减小libqte的大小的目的。 你在configure qte的时候有一个-qconfig xxx参数, 这个xxx指定的是包含features宏的头文件,比如qtopia里带的qconfig-qpe.h就是专门为qtopia量身定制的宏定义文件,该文件里去掉了qtopia未用到的feature(如打印等)。如果configure时不指定-qconfig参数,则会提示你从qte预先定义好的 qconfig中选择一个,如small/large/full, 这三项对应不同的qconfig-xxx文件,每个文件包含不同的feature定义。 具体的位置在:$QTEDIR/src/tools/qconfig-xxx.h 我们要裁减qte库最好是建立一个自己的qconfig-myconfig.h文件, 把自己的程序未用到的特性对应的宏定义在这个文件里。 configure qte的时候加-qconfig myconfig选项,这样就可以使用自己的feature定义文件了。 另外需要注意的一点是, feature之间有依赖关系,你disable某个特性很可能连带其他一些特性也被disable。 所以还要参看$QTEDIR/src/tools/qfeatures.h中对feature依赖关系的描述。 feature宏对应的功能参见文档: http://doc.trolltech.com/qtopia2.0/html/features.html 如何改变qvfb桌面的默认颜色(绿色)? qte 2.x里提供的API: QWSServer::setDesktopBackground(const QColor&); QWSServer::setDesktopBackground(const QImage&);
qtopia core 4里提供的API: QWSServer::setBackground(const QBrush&); 默认的颜色在源码的qwindowsystem_qws.cpp文件, QWSServer的构造函数里赋值,也可以直接去修改源码。 Qtopia对触摸屏的支持 为了使Qtopia支持触摸屏,这两天真是耗尽了功夫和心思。工作了大约20个小时,仍然没有结果,郁闷,郁闷,极其郁闷!阅读了一些文档,过程艰辛,我下面做个简单的总结: Linux下的触摸屏驱动有两种,一种是需要应用程序定位的;一种是把定位信息写到驱动里面去的(貌似如此,不甚理解)。对于Mizi 2410来说,里面的驱动属于第一种。那么在移植Qt/E和Qtopia时,如何做才能使Qtopia支持触摸屏呢?我现在的理解是有两种办法。 第一种是修改Qt/E里面的src/kernel/qwsxx_mouse.cpp文件(文件名字记不清出了,反正差不多),具体方法是首先把在该文件种添加#define CUSTOMTOUCH(该文件上面本行被注释调了,出去注释即可),然后修改程序源代码,具体修改的办法可见Qopia 2.1.1 文档中pointer handling一文。同时在config Qtopia时,最好在设备特定配置文件中加入#define QWS_NEED_CALIBRATION,这样当Qtopia在启动时会去检验在/etc是否有pointcal文件,没有的话,就先产生叫用户校正的过程,并把校正信息存放在/etc/pointcal文件中,以后启动时不再需要校正。如果没有加入#define QWS_NEED_CALIBRATION配置,那么为了使Qtopia相应你的触摸平,你必须在启动QTOPIA前进行校正(必须用与QT/E里面相同的算法),并产生/etc/pointcal文件,否则Qtopia启动时会报告打不开该文件,从而无法相应触摸平。
第二种不用修改Qt/E,而是利用tslib。在配置QT/E时加入-tslib,在配置Qtopia时加入#define QWs_NEED_CALIBRATION(如果不加,你必须在启动Qtopia前进行校正产生/etc/pointcal文件),这样第一次启动 Qtopia时,它会调用QT/E里面的校正函数进行校正。而QT/E的校正函数正是利用tslib提供的统一的接口。那么具体编译文件的顺序是什么呢?由于触摸平的驱动提供的结构不尽相同,所以tslib其实对不同的触摸平的驱动做了一个封装,利用tslib时,只要按照tslib里面plugin的例子针对你的触摸平驱动写一个小小的plugin,然后编译tslib,再利用你编译出来的tslib库编译Qt/E,进而再编译Qtopia即可。 我按照我总结的第二种方法,做好了所有的东西,结果由于板子nfs及其不好,执行qpe时老是连接中断,一直无法正常运行。没办法,只好把flash分出 25M来做成jffs2文件系统,打算把Qtopia文件拷贝到flash上面去,结果没有jflash工具,还是只能利用Nfs拷贝,My God! 拷贝时nfs仍然不ok!天不遂人愿 ,没办法,今天回家先,明天有空的话想办法把文件拷贝到flash上再试一试吧。
|