歡迎您光臨本站 登入註冊首頁

Qtopia FAQ

admin @ 2014-03-25 , reply:0

概述

Qt-X11/QtEmbedded/Qtopia及其他常見包的關係?buildQtopia時經常能看到以下的包:qt-x11-2.3.2qt-x11-3.3.xqte-2.3.xqtopia-2.xt……

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上再試一試吧。


[admin via 研發互助社區 ] Qtopia FAQ已經有3632次圍觀

http://cocdig.com/docs/show-post-42276.html