乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      嵌入式qt的安裝和應(yīng)用...

       lihonghao_shzh 2008-03-27
      嵌入式qt的安裝和應(yīng)用
      嵌入式工具Qt的安裝與使用

      摘要
      Qt是Trolltech公司的一個產(chǎn)品。Trolltech是挪威的一家軟件公司,主要開發(fā)兩種產(chǎn)品:一種是跨平臺應(yīng)用程序界面框架;另外一種就是 提供給做嵌入式Linux開發(fā)的應(yīng)用程序平臺,能夠應(yīng)用到PDA和各種移動設(shè)備上。Qt和 Qtopia分別是其中具有代表性的兩個。(2004-05-05 10:52:14)

      --------------------------------------------------------------------------------
      By lanf, 出處:http://tech./pub/article/c310_a71173_p1.html

      作者:胡利民 本文選自:開放系統(tǒng)世界

      Qt是Trolltech公司的一個產(chǎn)品。Trolltech是挪威的一家軟件公司,主要開發(fā)兩種產(chǎn)品:一種是跨平臺應(yīng)用程序界面框架;另外一種就是 提供給做嵌入式Linux開發(fā)的應(yīng)用程序平臺,能夠應(yīng)用到PDA和各種移動設(shè)備上。Qt和Qtopia分別是其中具有代表性的兩個。

      Qt是一個多平臺的C++圖形用戶界面應(yīng)用程序框架,它能給用戶提供精美的圖形用戶界面所需要的所有元素,而且它是基于一種面向?qū)ο蟮乃枷?,所以用戶對其對象的擴(kuò)展是相當(dāng)容易的,并且它還支持真正的組件編程。

      Qt是Linux桌面環(huán)境KDE的基礎(chǔ)。筆者認(rèn)為,可以說Qt與Windows下的Mfc的實(shí)質(zhì)是一樣的,所以Qt最大的優(yōu)點(diǎn)在于其跨平臺性,可以支持現(xiàn)有的多種操作系統(tǒng)平臺,主要有:

      ◆ MS/Windows 95、Windows 98、WindowsNT 4.0、Windows 2000、Windows XP;

      ◆ Unix/X11 Linux、Sun Solaris、HP-UX、Compaq True64Unix、IBM AIX、SGI IRIX和很多其它X11平臺;

      ◆ Macintoshi Mac OSX;

      ◆ Embedded—帶FramBuffer的Linux平臺。

      下面簡單介紹一下Qt/Embedded和Qtopia在Linux上的安裝和使用,還有在開發(fā)過程中可能碰到的一些問題。

      Qt 和Qtopia的安裝

      如果需要安裝一個帶FramBuffer的Qtopia平臺,需要有以下軟件(所列舉軟件以筆者使用的為例):

      ◆ Qtopia 1.6.0;

      ◆ Tmake 1.11;

      ◆ Qt/Embedded 2.3.4(Qtopia 1.6.0是基于該開發(fā)平臺上開發(fā)的);

      ◆ Qt/Embedded 2.3.2 for X11;

      ◆ Qt 3.1.2 for X11。

      在Trolltech公司的網(wǎng)站上可以下載該公司所提供的Qt/Embedded的免費(fèi)版本。

      Qtopia平臺安裝分為以下幾個步驟:

      1. 解包Qtopia

      在Linux命令模式下運(yùn)行以下命令:

      tar xfz qtopia-source-1.6.0 (解包)
      cd qtopia-source-1.6.0
      export QPEDIR=$PWD (設(shè)置環(huán)境變量)
      cd..



      2. 安裝Tmake

      在Linux命令模式下運(yùn)行以下命令:

      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




      3. 安裝Qt/Embedded2.3.4

      在Linux命令模式下運(yùn)行以下命令:


      tar xfz qt-embedded-2.3.4-commercial.tar.gz
      cd qt-2.3.4
      export QTDIR=$PWD
      export QTEDIR=$QTDIR
      export PATH=$QTDIR/binPATH
      export LD_LIBRARY_PATH=$QTDIR/libLD_LIBRARY_PATH
      cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/
      . /configure -qconfig qpe -qvfb -depths 4,8,16,32
      make sub-src
      cd ..




      也可以在configure的參數(shù)中添加-system-jpeg和gif,使Qtopia平臺能支持jpeg、gif格式的圖形。

      4. 安裝Qt/X11 2.3.2

      在Linux命令模式下運(yùn)行以下命令:


      tar xfz qt-x11-2.3.2-commercial.tar.gz
      cd qt-2.3.2
      export QTDIR=$PWD
      export PATH=$QTDIR/bin:$PATH
      export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
      . /configure -no-opengl
      make
      make -C tools/qvfb
      mv tools/qvfb/qvfb bin
      cp bin/uic $QTEDIR/bin
      cd ..




      根據(jù)開發(fā)者本身的開發(fā)環(huán)境,也可以在configure的參數(shù)中添加別的參數(shù),比如-no-opengl或-no-xfs,可以鍵入./configure -help來獲得一些幫助信息。

      5. 安裝Qt/X11 3.1.2

      在Linux命令模式下運(yùn)行以下命令:


      tar xfz qt-x11-commercial-3.1.x.tar.gz
      cd qt-x11-commercial-3.1.x
      export QTDIR=$PWD
      export QT3DIR=$QTDIR
      export PATH=$QTDIR/bin:$PATH
      export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
      ./configure -thread
      make
      cd ..




      6. 安裝Qtopia

      在Linux命令模式下運(yùn)行以下命令:


      cd qtopia-source-1.6.x
      export QTDIR=$QTEDIR
      export QPEDIR=$PWD
      export PATH=$QPEDIR/bin:$PATH
      cd src
      ./configure
      make
      cd ../..




      7. 安裝Qtopia桌面


      cd qtopia-source-1.6.x/src
      export QTDIR=$QT3DIR
      ./configure -qtopiadesktop
      make
      mv qtopiadesktop/bin/qtopiadesktop ../bin
      cd ..





      Qt和Qt Designer的使用

      根據(jù)上面的步驟安裝完成了Qt/Embedded和Qtopia之后,就可以運(yùn)行這些程序了。

      運(yùn)行Qt的虛擬仿真窗口:在Linux的圖形模式下運(yùn)行命令qvfb&;Qtopia只是一個用Qt/Embedded開發(fā)的程序,運(yùn)行Qtopia,在圖形模式下運(yùn)行命令:


      export QTDIR=$QTEDIR,
      qpe &;




      這樣Qtopia的程序就運(yùn)行在QVFB上,即Qt的虛擬仿真窗口。

      Qt/Embedded是針對嵌入式Linux而開發(fā)的一種開發(fā)工具,Qt封裝了一些常用的類,而且這些類的名字都以Q字開頭命名,如QString、QDialog等。這里主要介紹一下如何利用Qt Designer來設(shè)計(jì)組件,并生成相應(yīng)的代碼。

      在Qt中,把組件分為復(fù)合體、原始體和配件。而在Qt中,組件是由一些抽象類、復(fù)雜的組件類、管理組件幾何特性的類等組成。

      Qt中有三個主要的基類:QObject、Qapplication和QWidget。

      在Qt 中編程,利用Signal和Slot進(jìn)行對象之間的通信是Qt的主要特征。它與Windows中的消息機(jī)制非常類似,但是Signal和Slot機(jī)制真正 實(shí)現(xiàn)了一種消息的封裝。當(dāng)對象的狀態(tài)改變時,發(fā)出Signal,通知所有的Slot接受Signal,盡管它不知道哪些函數(shù)是Slot,Slot一開始也 不知道哪些Signal可以接收。Signal和Slot之間不是一一對應(yīng)的關(guān)系,一個Signal可以發(fā)給多個Slot, Slot也可以接收多個Signal。Slot除了可以接收Signal以外,與其它的成員函數(shù)沒有區(qū)別。這種機(jī)制比使用回調(diào)函數(shù)要靈活,但是會減慢程序 的運(yùn)行速度。不過在現(xiàn)在高速CPU的面前,這種損失是無足輕重的,而且它還能保證程序的簡明性和靈活性,非常便利。

      在Qt的組件中,不僅定義了常用的成員變量和成員函數(shù),還定義了所有與該組件相關(guān)的Signal和Slot。

      要將組件組合起來,最簡單的方法就是使用Qt Designer。首先要啟動Qt Designer,在Linux命令模式下,鍵入以下命令(假設(shè)Qt安裝在/usr/local下):


      cd qt-2.3.2/bin
      ./designer




      這樣就可以啟動一個與Windows下的Delphi相類似的如圖1的界面。


      然后新建一個QFrame,將自己需要的組件直接拖拉到這個Frame中,相信很多人都有過這樣的經(jīng)歷,此處就不再詳細(xì)描述了。完成之后存盤時,會將這個 新的組件保存為一個擴(kuò)展名為.ui的文件。假設(shè)所存的文件名為test.ui,用vi test.ui來查看這個文件,發(fā)現(xiàn)這是一個用xml語言寫的一個文本。下面用這個test.ui生成相應(yīng)的test.h和test.cpp。同樣還是在 這個目錄下,可以看到一個uic的工具,這個是Qt專門用來將ui文件生成.h和.cpp文件的,在終端模式下鍵入以下命令:


      ./uic -o test.h test.ui
      ./uic -o test.h -i test.cpp test.ui





      此時就能看到生成了相應(yīng)test.h和test.cpp,這是一個類。當(dāng)然這只是一些表面的東西,還需要在這些代碼中添加相應(yīng)的Signal和Slot, 完成所需要的操作。值得注意的是,相應(yīng)版本生成的ui最好用相應(yīng)版本的uic來生成代碼。如果用Qt 3.1.2的Designer生成的ui,用Qt 2.3.2的uic來生成代碼,生成的代碼都會是一些空函數(shù)。

      在一般的開發(fā)過程中,首先通過這個ui生成的一個類,在Qt中通常叫做 Base,如上面的例子,叫做testBase;然后再新建一個類,來繼承這個Base。通常叫做實(shí)現(xiàn)類Impl,如testImpl。在這個實(shí)現(xiàn)類里面 定義所需要的成員函數(shù)、Signal和Slot,因?yàn)閡i可能是經(jīng)常需要改動的。如果這樣做,每次只需要在Designer中修改ui,而不用去理會這些 成員函數(shù)、Signal和Slot了。

      編譯一個Qt程序必然需要Makefile,在Qt中提供了一個專門生成Makefile的工具,就是tmake。用tmake需要根據(jù)編寫的程序?qū)懸粋€.pro文件。.pro文件非常簡單,有固定的格式,下面是一個例子:


      TEMPLATE = app
      CONFIG = qtopia warn_on release
      MOC_DIR =tmp
      OBJECTS_DIR =tmp
      HEADERS =fcrs.h\
      structs.h \
      globalfunc.h \
      globalvars.h \
      testimpl.h
      SOURCES = main.cpp \
      globalfunc.cpp\
      globalvars.cpp \
      testimpl.cpp
      INTERFACES = test.ui \
      TARGET = fcrs




      生成這個.pro文件之后,在終端中鍵入下面的命令:


      tmake -o Makefile test.pro




      就自動生成了一個Makefile,使用這個Makefile編譯所編寫的程序就可以了。



      Qt/Embedded開發(fā)環(huán)境建立的過程

      --------------------------------------------------------------------------------


      Qt/Embedded開發(fā)環(huán)境建立的過程:
      (這些軟件可以免費(fèi)從trolltech的WEB或FTP服務(wù)器上下載)
      ◆ tmake 1.11 或更高版本; (生成Qt/Embedded應(yīng)用工程的Makefile文件)
      ◆ Qt/Embedded 2.3.7 (Qt/Embedded 安裝包)
      ◆ Qt 2.3.2 for X11; (Qt的X11版的安裝包, 它將產(chǎn)生x11開發(fā)環(huán)境所需要的兩個工具)
      1、安裝tmake
      在Linux 命令模式下運(yùn)行以下命令:
      tar xfz tmake-1.11.tar.gz
      export TMAKEDIR=$PWD/tmake-1.11
      export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
      export PATH=$TMAKEDIR/bin:$PATH
      2. 安裝Qt/Embedded 2.3.7
      在Linux 命令模式下運(yùn)行以下命令:
      tar xfz qt-embedded-2.3.7.tar.gz
      cd qt-2.3.7
      export QTDIR=$PWD
      export QTEDIR=$QTDIR
      export PATH=$QTDIR/bin:$PATH
      export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
      ./configure -qconfig -qvfb -depths 4,8,16,32
      make sub-src
      cd ..
      上述命令 ./configure -qconfig -qvfb -depths 4,8,16,32 指定Qt 嵌入式開發(fā)包生
      成虛擬緩沖幀工具qvfb,并支持4,8,16,32 位的顯示顏色深度。另外我們也可以在
      configure 的參數(shù)中添加-system-jpeg 和gif,使Qt/Embedded 平臺能支持jpeg、gif
      格式的圖形。
      上述命令 make sub-src 指定按精簡方式編譯開發(fā)包,也就是說有些Qt 類未被編
      譯。Qt 嵌入式開發(fā)包有5 種編譯范圍的選項(xiàng),使用這些選項(xiàng),可控制Qt 生成的庫文件的大
      小,但是您的應(yīng)用所使用到的一些Qt 類將可能因此在Qt 的庫中找不到鏈接。編譯選項(xiàng)的具
      體用法可運(yùn)行./configure -h(huán)elp 命令查看。
      3. 安裝Qt/X11 2.3.2
      在Linux 命令模式下運(yùn)行以下命令:
      tar xfz qt-x11-2.3.2.tar.gz
      cd qt-2.3.2
      export QTDIR=$PWD
      export PATH=$QTDIR/bin:$PATH
      export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
      ./configure -no-opengl
      make
      make -C tools/qvfb
      mv tools/qvfb/qvfb bin
      cp bin/uic $QTEDIR/bin
      cd ..
      根據(jù)開發(fā)者本身的開發(fā)環(huán)境,也可以在configure 的參數(shù)中添加別的參數(shù),比如
      -no-opengl 或-no-xfs,可以鍵入./configure -help 來獲得一些幫助信息。
      如果Qt/Embedded 的應(yīng)用是在UNIX 平臺下開發(fā)的話,那么它就可以在開發(fā)的機(jī)器
      上以一個獨(dú)立的控制臺或者虛擬緩沖幀的方式來運(yùn)行,對于后者來說,其實(shí)是有一個X11
      的應(yīng)用程序虛擬了一個緩沖幀。通過指定顯示設(shè)備的寬度,高度和顏色深度,虛擬出來
      的緩沖幀將和物理的顯示設(shè)備在每個像素上保持一致。這樣每次調(diào)試應(yīng)用時開發(fā)人員就
      不用總是刷新嵌入式設(shè)備的FLASH 存儲空間,從而加速了應(yīng)用的編譯、鏈接和運(yùn)行周期。
      運(yùn)行Qt 的虛擬緩沖幀工具的方法是:在Linux 的圖形模式下運(yùn)行命令:
      qvfb (回車)
      當(dāng)Qt 嵌入式的應(yīng)用程序要把顯示結(jié)果輸出到虛擬緩沖幀時,我們在命令行運(yùn)行這
      個程序時,在程序名后加上-qws 的選項(xiàng)。例如: $> hello -qws


      一,QT/E的安裝。
      在本機(jī)中安裝了包括QT4.0.1(WINDOWS版本)以及QT/E2。3。7(LINUX版本)。
      QT/E我安裝在我的虛擬機(jī)中。因?yàn)镼T/E2.3.7的版本問題,其適宜在REDHAT9。0版本(或更低版本)下安裝,否則安裝不成功。
      QT/E安裝過程復(fù)雜,具體細(xì)節(jié)可以參考下面這篇文章?!禥t/Embedded開發(fā)環(huán)境建立的過程》
      此文在網(wǎng)上可搜索到。

      本機(jī)下虛擬機(jī)中QT/E安裝路徑為:/home/wangxl/QTE/qt-2.3.7
      QT/X11安裝路徑為:/home/wangxl/QTE/qt-2.3.2
      Tmake安裝路徑為:/home/wangxl/QTE/Tmake-1.8

      QT/E下載地址為:ftp://ftp.rediris.es/mirror/Qt/source/
      Tmake下載地址為:ftp://ftp.trolltech.com/freebies/tmake/

      二.QT與QT/E以及QT3與QT4之間的區(qū)別
      相對來說QT與QT/E的語法一樣,所不同之處在庫類大小或者庫類函數(shù)大小不同而已。QT/E相對于QT來說,不具有少數(shù)類或者少數(shù)函數(shù)的支持。具體QT/E是否包含某個類或者包含某個類中的函數(shù),我的方法是在QT/E安裝目錄下的include文件夾中去查找。
      QT3和QT4有很多不同點(diǎn),主要不同也是在于庫類以及支持函數(shù)有所變化,比如,有些QT3中的函數(shù),在QT4中被其他函數(shù)名所代替,因此很多QT4程序在QT3環(huán)境下無法執(zhí)行。QT/E2.3.7與QT3基本相同,除了我前面提到的QT與QT/E的差別。

      三.QT/E編譯與執(zhí)行。
      1.在QT/E編譯與執(zhí)行前要先設(shè)置TMAKE與QT/E LIB環(huán)境,具體方法如下:
      [root@localhost tmake-1.8]# export TMAKEDIR=$PWD
      [root@localhost tmake-1.8]# export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
      [root@localhost tmake-1.8]# export PATH=$TMAKEDIR/bin:$PATH
      [root@localhost qt-2.3.7]# export QTDIR=$PWD
      [root@localhost qt-2.3.7]#export QTEDIR=$QTDIR
      [root@localhost qt-2.3.7]#export PATH=$QTDIR/bin:$PATH
      [root@localhost qt-2.3.7]#export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

      2.如果你是用DESIGNER工具設(shè)計(jì)的界面(后面有講),則要將*.ui文件轉(zhuǎn)換成*.h文件和*.cpp文件。轉(zhuǎn)換方法如下:
      uic –o test.h test.ui
      uic –o test.cpp –i test.h test.ui

      3.編寫一個*.pro文件(用來生成Makefile文件用),該文件格式比較固定。
      如test.pro文件基本格式如下(以test.cpp ,test.h main.cpp為例子):
      EMPLATE = app
      CONFIG += qt warn_on release
      HEADERS = test.h
      SOURCES = test.cpp \
      main.cpp
      TARGET = hello
      DEPENDPATH=/home/wangxl/QTE/qt-2.3.7/include
      REQUIRES=

      4.生成Makefile文件
      方法為:tmake –o Makefile test.pro
      5 編譯生成可執(zhí)行文件
      make

      6 打開QVFB
      進(jìn)入安裝QT/X11所在目錄, 在BIN目錄下執(zhí)行程序qvfb。
      有時候需要修改qvfb執(zhí)行時的deptb參數(shù)才能夠執(zhí)行QT/E程序。可以直接在QVFB打開窗口的Configure彩單項(xiàng)中選擇,也可以用如下命令執(zhí)行QVFB。
      ./qvfb –width ** -height ** -depth **
      7.執(zhí)行QT/E程序
      如 。/TEST
      在QVFB程序打開的窗口中將出現(xiàn)TEST程序的顯示 。

      四.Qt/e與QT/X11
      安裝QT/E的同時還需要安裝QT/X11與Tmake,Tmake 是用來幫助生成Makefile文件的。安裝QT/X11主要是向QT/E提供designer工具和qvfb工具的。
      Designer可以用來設(shè)計(jì)圖形界面,最后生成.ui文件,可通過UIC命令轉(zhuǎn)換為相應(yīng)的C++文件。
      QVFB模擬幀緩沖,提供QT/E程序的顯示平臺。

      五.QT/E 程序ARM 板上執(zhí)行
      在我虛擬機(jī)上可以執(zhí)行的QT/E程序不能在ARM板上執(zhí)行,需要對QT/E進(jìn)行重新編譯,并需要設(shè)置響對于ARM板系統(tǒng)的編譯環(huán)境,具體方法可以參考我另外的一文《QT/E開發(fā)記錄》

      六.QT/E支持中文顯示問題
      QT/E需要字體轉(zhuǎn)換才能顯示中文。具體方法可以參考我另外的一文《QT/E開發(fā)記錄》
      但是由于缺少UNICODE的QPF文件的字體,中文字大小不均勻問題尚沒解決。

      七 QT/E的一些參考資料:
      http://www./bbs/index.php QT中文論壇
      http://www./qt/ (關(guān)于QT3的類,以及類函數(shù)可以在這尋找)
      提供QT3編程最好書籍的電子版本《C++ GUI Programming with QT 3》(本機(jī))
      關(guān)于QT4可以參考QT ASSISTNAT(本機(jī)中),另外QT ASSISTNAT中也可以查找QT3的類及庫等。



      設(shè)置Qtopia的build環(huán)境
      1、環(huán)境變量
      在目標(biāo)系統(tǒng)上build Qtopia必須設(shè)定必要的環(huán)境變量,如QTDIR, 如果依賴多個版本的Qt,則需要用環(huán)境變量指向用到的庫配置。
      一種方法是將環(huán)境變量的設(shè)定寫入文件,通過運(yùn)行source命令應(yīng)用文件的內(nèi)容。

      舉例說明:
      Linux/bash下建立環(huán)境變量設(shè)定文件qtopia.sh, 內(nèi)容如下:
      export QPEDIR=/opt/Qtopia
      export QTDIR=/opt/Qtopia
      export PATH=$QTDIR/bin:$PATH
      export TMAKEPATH=/opt/Qtopia/tmake/lib/qws/linux-generic-g++
      export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

      需要時運(yùn)行 source qtopia.sh即可應(yīng)用以上環(huán)境變量。

      另外也可以通過在.bashrc文件中設(shè)定別名來應(yīng)用這些環(huán)境變量。 假設(shè)環(huán)境變量設(shè)置文件存放在home目錄的bin下, 則可在.bashrc中加入:
      alias qtopia=‘source ~/bin/qtopia.sh‘

      2、創(chuàng)建自定義的配置文件

      整個Qtopia系統(tǒng)在build過程中需要三個獨(dú)立的配置系統(tǒng):
      1) Qt/Embedded 配置文件
      2) tmake - 用于build Qtopia 1.x和一些第三方軟件
      3) qmake - 用于build Qtopia 2及以上版本

      在build Qtopia以前,先要完成以上三項(xiàng)的配置。

      下面是創(chuàng)建一個“myarm”配置的例子:
      cp -r $TMAKEDIR/lib/qws/linux-arm-g++ $TMAKEDIR/lib/qws/linux-myarm-g++
      cp -r $QTEDIR/configs/linux-arm-g++-shared $QTEDIR/configs/linux-myarm-g++-shared
      cp -r $QPEDIR/mkspecs/qws/linux-arm-g++ $QPEDIR/mkspecs/qws/linux-myarm-g++
      Qt/Embedded
      編輯$QTEDIR/configs/linux-myarm-g++-shared, 修改其中的utilities和flags成適合系統(tǒng)的內(nèi)容, 如:
      可能需要修改SYSCONF_CXX, SYSCONF_CC 和SYSCONF_LINK, 指定正確的編譯器. 可能需要增加編譯選項(xiàng)-DMYARM,在代碼中增加宏#ifdef MYARM(用以增加設(shè)備相關(guān)的代碼)
      tmake
      編輯$TMAKEDIR/lib/qws/linux-myarm-g++/tmake.conf,修改用到的utilites和flags:
      可能需要修改TMAKE_CC, TMAKE_CXX 和TMAKE_LINK
      可能需要增加-DMYARM選項(xiàng)
      qmake

      修改$QPEDIR/mkspecs/qws/linux-myarm-g++/qmake.conf:

      QMAKE_CC, QMAKE_CXX 和QMAKE_LINK
      -DMYARM
      注意:qmake.conf的最后一行必須是:
      exists($$(QPEDIR)/src/config.pri):include($$(QPEDIR)/src/config.pri)


      可用于目錄名的字符

      正則表達(dá)式字符

      Qtopia 1.9.x和Qtopia 2.0.0 - 2.1.0對字符有以下的要求:

      Qtopia build系統(tǒng)訪問到的任何目錄都不能包含正則表達(dá)式字符
      任何能被QRegExp識別的特殊字符和字符序列都可能引起問題
      ‘.‘字符只匹配自身
      不要將正則表達(dá)式字符用于目錄名,包括(但不僅限于): + . ? * \ () [] ^ $ {}
      注:Qtopia 2.1.0和2.1.1及以上版本可以通過應(yīng)用patch解除以上的限制

      空格

      Qtopia build系統(tǒng)不支持目錄名中包含空格。

      必須保證:

      build系統(tǒng)訪問到的目錄不包含空格
      訪問目錄的各層上級目錄也不包含空格

      Qtopia的依賴和必要條件

      簡介
      為了使Qtopia正確運(yùn)行, 必須滿足以下的必要條件:
      安裝適當(dāng)?shù)木幾g/交叉編譯工具
      Qt/Embedded-2.3.11
      Linux kernel提供共享內(nèi)存、mmap和socket支持
      Linux支持frame buffer
      Linux支持OSS聲音或支持與OSS兼容的ALSA聲音。 進(jìn)一步的信息參考 The Qtopia A/V & Appearance FAQ
      還需要以下的庫:

      Video4Linux
      zlib
      libuuid(aka luuid)
      libjpeg
      xorg 或X11
      注:Freetype不是必須的但建議支持 http://freetype./index2.html


      支持的編譯器和交叉編譯器

      gcc-2.95.2
      gcc 3.2.4
      gcc-3.3.0, gcc-3.3.3, gcc-3.3.4
      gcc-3.4.1


      聲音

      Qtopia需要/dev/dsp可寫,并支持以下的ioctl操作:


      SNDCTL_DSP_SETFRAGMENT - Qtopia將這個值設(shè)置為0x4000c.
      SNDCTL_DSP_SETFM - Qtopia設(shè)置為AFMT_S16_LE
      SNDCTL_DSP_STEREO - Qtopia 設(shè)置為 1/true.
      SNDCTL_DSP_SPEED - Qtopia設(shè)置為44100.
      SNDCTL_DSP_GETOSPACE
      Qtopia 還需要/dev/dsp可以以阻塞方式和非阻塞方式打開。 以上的設(shè)定是Qtopia需要的設(shè)定,但可以容許少許的偏差,但如果不設(shè)定成Qtopia需要的值則不能保證音頻能平滑播放。 假如您的設(shè)備只支持22500的播放速率,則在調(diào)用SNDCTL_DSP_SPEED時要報告此速率,以免造成音頻質(zhì)量的缺損。 不過,如果系統(tǒng)不支持GETOSPACE,非阻塞寫入或 SNDCTL_DSP_SET_FRAGMENT, 幾乎可以肯定必然會損失音頻質(zhì)量。


      Video4Linux

      Camera應(yīng)用程序需要支持Video4Linux v1的內(nèi)核, Qtopia沒有提供該支持。

      請參考官方的 Video for Linux 資源站點(diǎn),參看API的詳細(xì)內(nèi)容。


      zlib

      zlib可以從 http://www./zlib/ 下載


      libuuid(aka luuid)

      Qtopia不提供uuid支持。 這個庫可以從 http://e2fsprogs./ 站點(diǎn)下載

      另外, 如果你有SuSE Linux的發(fā)行版, e2fsprogs-devel這個包可以提供uuid支持; 在Debian中對應(yīng)的包是uuid-dev. 這個庫應(yīng)該放在標(biāo)準(zhǔn)路經(jīng)下/usr/lib/libuuid.so


      請用包管理工具來查看該包是否已經(jīng)安裝:

      rpm -qa | grep e2fsprogs

      如果尚未安裝,請從安裝盤或鏡像站安裝這個包。

      需要注意的是,如果沒有安裝e2fsprogs-devel,在鏈接時會發(fā)生下面的錯誤:

      /usr/lib/gcc-lib/i586-suse-Linux/3.3.3/../../../../i586-suse-linux/bin/ld:
      cannot find -luuid
      如果安裝了該庫仍遇到上述錯誤,則檢查Qtopia的configure腳本的-L和-R參數(shù), 以確定腳本包含了庫的實(shí)際路徑。 關(guān)于交叉編譯的信息可參考 System Integrator‘s Guide.


      libjpeg

      Qtopia不提供jpeg庫。 Qtopia需要Qt/Embedded配置為支持jpeg。

      libjpeg庫可從 http://www./ 下載

      此外,如果你有SuSE發(fā)行版, libjpeg這個包可提供該庫。 這個庫應(yīng)該安裝在標(biāo)準(zhǔn)路經(jīng)/usr/lib/libjpeg.so

      檢查libjpeg包是否已經(jīng)安裝:

      rpm -qa | grep libjpeg

      如果未安裝,請從安裝盤或鏡像站安裝。

      關(guān)于libjpeg交叉編譯的信息, 可參考System Integrator‘s Guide.


      xorg或X11

      開發(fā)包括有從以下站點(diǎn)下載:

      http://www./
      http://xorg.
      相關(guān)討論

      決定開始Qtopia需要的步驟, 參考: Getting started

      將Qtopia集成到特定設(shè)備上的重點(diǎn)步驟, 參考: System Integrator‘s guide

      Qtopia的FAQs,參看: Qtopia index page


      系統(tǒng)是完全安裝RedHat9.0(里面帶QT3.1),板子是X-Hyper250B的,Toolchain用的是開發(fā)板帶的hybus-arm-linux-R1.1

      交叉編譯所用到的文件:
      qt-embedded-2.3.10-free.tar.gz
      qt-x11-2.3.2.tar.gz
      qtopia-free-source-2.1.1.tar.gz
      tmake-1.13.tar.gz
      e2fsprogs-1.35.tar.gz

      主機(jī)x86的編譯步驟:
      tar xfz qt-embedded-2.3.10-free.tar.gz(解壓后qt-2.3.10改名為qt-2.3.10-host)
      export QTEDIR=$PWD/qt-2.3.10-host
      tar xfz qt-x11-2.3.2.tar.gz(解壓后qt-2.3.2)
      export QT2DIR=$PWD/qt-2.3.2
      tar xfz qtopia-free-source-2.1.1.tar.gz(解壓后qtopia-free-2.1.1改名為qtopia-2.1.1-host)
      export QPEDIR=$PWD/qtopia-2.1.1-host
      tar xfz tmake-1.13.tar.gz(解壓后tmake-1.13)
      export TMAKEDIR=$PWD/tmake-1.13
      export TMAKEPATH=$PWD/tmake-1.13/lib/qws/linux-x86-g++
      export PATH=$TMAKEDIR/bin:$PATH

      cd qt-2.3.2
      export QTDIR=$QT2DIR
      export PATH=$QTDIR/bin:$PATH
      export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
      ./configure -no-xft
      make
      make -C tools/qvfb
      cd ..

      cd qt-2.3.10-host
      export QTDIR=$PWD
      export PATH=$QTDIR/bin:$PATH
      export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
      mkdir bin (因?yàn)榻鈮汉蟮膓t-2.3.10沒有bin文件夾)
      cp $QT2DIR/bin/uic bin
      cp $QT2DIR/tools/qvfb/qvfb bin
      cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/
      ./configure -qconfig qpe -qvfb -thread -system-jpeg -gif -depths 4,8,16,32
      make
      cd ..

      tar xzf e2fsprogs-1.35.tar.gz
      cd e2fsprogs-1.35
      ./configure -enable-elf-shlibs
      make install lib/uuid/
      注:這是編譯x86的libuuid庫
      cd ..

      cd qtopia-2.1.1-host
      export PATH=$QPEDIR/bin:$PATH
      export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBRARY_PATH
      ./configure
      make

      編譯例子:
      $qmake -project ==>>我都是這樣創(chuàng)建.pro文件的
      $tmake -o Makefile hello.pro
      $make
      $qvfb &
      $./hello -qws 或者$qpe
      還沒怎么仔細(xì)研究過。


      目標(biāo)機(jī)arm-linux的編譯步驟:
      tar xfz qt-embedded-2.3.10-free.tar.gz(解壓后qt-2.3.10改名為qt-2.3.10-target)
      export QTEDIR=$PWD/qt-2.3.10-target
      tar xfz qt-x11-2.3.2.tar.gz
      export QT2DIR=$PWD/qt-2.3.2
      tar xfz qtopia-free-source-2.1.1.tar.gz(解壓后qtopia-free-2.1.1改名為qtopia-2.1.1-target)
      export QPEDIR=$PWD/qtopia-2.1.1-target
      tar xfz tmake-1.13.tar.gz
      export TMAKEDIR=$PWD/tmake-1.13
      export TMAKEPATH=$PWD/tmake-1.13/lib/qws/linux-arm-g++
      export PATH=$TMAKEDIR/bin:$PATH

      cd qt-2.3.2
      export QTDIR=$QT2DIR
      export PATH=$QTDIR/bin:$PATH
      export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
      ./configure -no-xft
      make
      make -C tools/qvfb
      cd ..

      cd qt-2.3.10-target
      export QTDIR=$PWD
      export PATH=$QTDIR/bin:$PATH
      export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
      mkdir bin
      cp $QT2DIR/bin/uic bin
      cp $QT2DIR/tools/qvfb/qvfb bin
      cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/
      ./configure -xplatform linux-arm-g++ -qconfig qpe -qvfb -thread -system-jpeg -gif -depths 4,8,16,32
      make
      cd ..
      注:這里需要arm版本的libjpeg.so.62,hybus-arm-linux-R1.1里面包含這個庫;如沒有可以上網(wǎng)下載。

      tar xzf e2fsprogs-1.35.tar.gz
      cd e2fsprogs-1.35
      ./configure -host=arm-linux -with-cc=arm-linux-gcc -with-linker=arm-linux-ld -enable-elf-shlibs -prefix=/usr/local/hybus-arm-linux-R1.1/arm-linux
      make install lib/uuid/ ===>>>這步安裝到hybus-arm-linux-R1.1/lib上的libuuid.so.1.2版本不對,
      要cp lib/libuuid.so.1.2 ../hybus-arm-linux-R1.1/lib
      注:這步是交叉編譯arm的libuuid庫,配置詳情見./configure --help
      (還要多謝 http://panjet./?p=20 這里面的大哥呀,好不容易才在網(wǎng)上找到的)
      cd ..

      cd qtopia-2.1.1-host
      export PATH=$QPEDIR/bin:$PATH
      export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBRARY_PATH
      cp src/libraries/qtopia/custom-linux-ipaq-g++.cpp src/libraries/qtopia/custom-linux-arm-g++.cpp
      cp src/libraries/qtopia/custom-linux-ipaq-g++.h src/libraries/qtopia/custom-linux-arm-g++.h
      ./configure -xplatform linux-arm-g++
      make
      注:這里需要libstdc++.so和libgcc_s.so庫


      develop環(huán)境下qt中文化程序設(shè)計(jì)

      原文出處:Linux公社
      原文作者:yfy001


      kdevelop是一款在linux平臺下可以同windows環(huán)境下的vc相媲美的集成開發(fā)環(huán)境,qt則是一款支持包括windows和linux平臺
      的GUI庫,可以說它是linux下的MFC.在顯示上,qt使用Unicode作為內(nèi)部編碼,可以支持多種編碼.如何使用qt進(jìn)行國際化編程
      在網(wǎng)上可以找到很多資料的,但都是針對較早版本的qt進(jìn)行介紹的.qt3.0.5中對這些作了些改動,這些方法就相應(yīng)的要做些改動.
      而且在kdevelop中開發(fā)qt應(yīng)用程序,將會事半功倍.我的開發(fā)環(huán)境為redhat8.0(需安裝kde開發(fā)工具包).
      首先在linux中打開kdevelop集成開發(fā)環(huán)境,用它的應(yīng)用程序向?qū)陆ㄒ粋€qt的SDI的應(yīng)用程序框架.這個同windows下vc很類似.它
      將會為你自動生成版本號,作者,e-mail等信息的單文檔對話框的應(yīng)用程序框架.我們首先對它自動生成的程序進(jìn)行漢化(qt1是
      我的項(xiàng)目名稱).
      1.漢化自動生成的程序
      添加翻譯文件
      在"項(xiàng)目"菜單中選擇"添加新的翻譯文件",語言選擇"zh_CN.Gb2312".將會創(chuàng)建一個zh_CN.GB2312字符編碼的翻譯文件.擴(kuò)展名
      為".ts".在qt3.0.5環(huán)境下,打開"*.ts"翻譯文件的工具是linguist.你可以在"工具"菜單中選擇"QT
      linguist"來打開,在linguist菜單中選擇"file"->"open"打開所要翻譯的翻譯文件.此時可以在linguist窗口中的source text中
      的文本就是你所要翻譯的文本,選擇所要翻譯的文本,在下方有一個類似一頁紙一樣的地方,在translate下輸入翻譯后的文本.
      所示.
      翻譯完這些文件后,編譯運(yùn)行,在我們的程序里并不能顯示中文,還是英文,我們還需要做的就是用lrelease命令將翻譯后的文件轉(zhuǎn)換
      成".qm"文件才可以使用.在控制臺下進(jìn)入你用kdevelop所生成的應(yīng)用程序目錄.
      >lrelease Makefile.am
      qt3.0.5用這個兩個程序取代了以前版本的findtr和msg2qm命令.在kdevelop集成環(huán)境中打開main.cpp主函數(shù),
      ......
      QApplication a(argc, argv);
      a.setFont(QFont("helvetica", 10));
      QTranslator tor( 0 );
      tor.load( QString("qt1.") + QTextCodec::locale(), "." );
      // tor.load( QString("qt1.zh_CN.GB2312"), "." );
      a.installTranslator( &tor );
      /* uncomment the following line, if you want a Windows 95
      look*/
      // a.setStyle(WindowsStyle);

      Qt1App *qt1=new Qt1App();
      //Form1 *qt1=new Form1();
      a.setMainWidget(qt1);
      ......
      此處:
      tor.load( QString("qt1.") + QTextCodec::locale(), "." );
      是根據(jù)客戶環(huán)境的locale來載入當(dāng)前目錄下相應(yīng)的翻譯文件的.redhat中文環(huán)境默認(rèn)的locale為gb18030,
      此處要么把翻譯文件名由qt1.zh_CN.GB2312.qm改為qt1.zh_CN.GB18030.qm,要么將這句改為
      tor.load( QString("qt1.zh_CN.GB2312"), "." );
      不過為了國際化編程的需要,建議采用第一種方法.更改后編譯運(yùn)行,你會發(fā)現(xiàn)你的程序已經(jīng)是中文界面的了.

      2.漢化自己的對話框
      大多數(shù)情況下我們都需要自己來設(shè)計(jì)對話框,qt為我們提供了非常好的對話框編輯器QtDesigner,可以很方便的設(shè)計(jì)我們的對話框,qt
      的信號和槽等,關(guān)于QtDesigner的使用,限于篇幅,不再贅述.以前面的程序?yàn)榛A(chǔ).在kdevelop中選擇"文件"->"新建",選擇Qt
      Designer文件(*.ui).在文件名一欄中填寫"mydialog",最后點(diǎn)擊確定按鈕,即會啟動QtDesigner,此處只拖了一個Label,寫了一
      些英文字符.對話框的name屬性為Form1.將對話框mydialog.ui保存.
      在控制臺下進(jìn)入你用kdevelop所生成的應(yīng)用程序目錄.
      >lupdate Makefile.am
      同樣用"QT
      linguist"來翻譯qt1.zh_CN.GB2312.tr文件.此時linguist的context中會多出Form1的選項(xiàng),這里面就是我們新建的對話框要翻譯的
      選項(xiàng).依據(jù)前面的方法進(jìn)行漢化.
      >lrelease Makefile.am
      生成qt1.zh_CN.GB2312.qm文件.
      編譯將會生成mydialog.cpp mydialog.h mydialog.moc文件.然后將main.cpp中的
      Qt1App *qt1=new Qt1App();改為
      Form1 *qt1=new Form1();
      并將"mydialog.h" #include
      進(jìn)去.依據(jù)前面的方法更改tor.load中加載的翻譯文件.編譯運(yùn)行,你的對話框也是中文的了.

      3.其它的一些說明
      由于qt返回的是Unicode編碼,譬如你在LineEdit中直接輸入中文,返回的就是??,qt中可以直接使用QTextCodec來轉(zhuǎn)換字符串的編碼.
      QString string;
      string=LineEdit1->text(); //取得LineEdit1返回的文字
      QTextCodec *codec=QTextCodec::codecForName("GBK");
      //轉(zhuǎn)換編碼
      QCString
      chinese_string=codec->fromUnicode(string);//用QCString來存儲返回的多字節(jié)編碼
      當(dāng)然,你在頭文件中就必需加入
      #include <qtextcodec.h>
      #include <qstring.h>
      #include <qcstring.h>

      4.QTextStream對中文的支持
      QTextCodec* codec = QTextCodec::codecForName("GBK"); /* 當(dāng)前編碼為"GBK" */
      QTextStream mystream(&file);
      mystream.setCodec(codec);

      5. QCString&QString
      QCString中不以unicode編碼
      QString以unicode為編碼.
      qt內(nèi)部使用unicode為編碼,所以如果要在qt的部件如multilineedit中顯示中文,則需要將非unicode的字符轉(zhuǎn)換成unicode字符.
      QCString locallyEncoded = "中國人不是東亞病夫"; // text to convert
      QTextCodec *codec = QTextCodec::codecForName("GBK"); // get the codec for GBK
      QString unicodeString = codec->toUnicode( locallyEncoded );

      http://www-128.ibm.com/developerworks/cn/l...oolkit/qt/i18n/

      Qt 國際化編程




      內(nèi)容:

      1. Qt 的文本顯示

      2. Qt 的文本輸入

      3. Qt 的打印

      對本文的評價



      訂閱:

      developerWorks 時事通訊






      于明儉

      2002 年 1 月 09 日

      本篇討論 Qt 庫對國際化的支持,將介紹 Qt 對文本顯示,輸入和打印的支持,和如何 使用Qt 開發(fā)國際化的軟件。
      Qt 目前的版本(2.2.4)對國際化的支持已經(jīng)相當(dāng)完善。 在文本顯示上,Qt 使用了Unicode 作為內(nèi)部編碼,可以同時支持多種編碼。 為 Qt 增加一種編碼的支持也比較方便,只要 增加該編碼和Unicode的轉(zhuǎn)換編碼便可以了。 Qt 目前支持ISO標(biāo)準(zhǔn)編碼ISO 8859-1, ISO 8859-2,ISO 8859-3,ISO 8859-4,ISO 8859-5,ISO 8859-7,ISO 8859-9,和 ISO 8859-15(對于阿拉伯語和希伯來語的支持正在開發(fā)之中),中文GBK/Big5,日文 eucJP/JIS/ShiftJIS,韓文eucKR,俄文KOI8-R。 當(dāng)然也可以直接使用UTF8編碼。

      Qt 使用了自己定義的Locale機(jī)制,在編碼支持和信息文件(Message File)的翻譯上彌補(bǔ)了目前Unix上所普遍采用Locale和gettext的不足之處。 Qt 的這種機(jī)制可以使 Qt 的同一組件(QWidget)上同時顯示不同編碼的文本。 比如,Qt 的標(biāo)簽上可以同時使用中文簡體 和中文繁體文本。

      在文本輸入上,Qt 采用了XIM(X Input Method)標(biāo)準(zhǔn)協(xié)議,可以直接使用XIM輸入服務(wù)器。 由于目前的絕大多數(shù)輸入服務(wù)器都是針對單一語言的,所以在 Qt 的標(biāo)準(zhǔn)輸入組件( QLineEdit,QMultiLineEdit)中的輸入受到單一編碼的限制,Qt 還不支持動態(tài)切換編碼輸入的支持,這是它的不足之處。

      1. Qt 的文本顯示
      像普通的國際化過程一樣,Qt 使用了類似GNU gettext一樣的函數(shù) QObject::tr(),它 用于從Qt的信息文件 .qm 中取出信息,這些信息是經(jīng)過 Qt 的工具處理的。 Qt在處理 編碼時還使用了 QTranslator 類,可用于指定整個應(yīng)用軟件的 的信息文件。

      使用 Qt 編寫國際化的程序,最好不要在程序中直接使用特殊編碼的文本。 比如要 編寫一中文界面的 Qt 程序,應(yīng)該在程序中使用英文,程序編寫完成后,把文本提取 出來翻譯。 這樣,程序還可以根據(jù)Locale的不同,支持多種語言。 下面介紹如何在 Qt 程序中標(biāo)注字符串,如何提取并翻譯文本。
      下面是一段使用了 QObject::tr()的代碼,它建立了一個彈出菜單,菜單項(xiàng)是"Quit", 它被放置在菜單條上,在菜單條上顯示的是標(biāo)簽"File"。



      QPopupMenu* popup;
      popup = new QPopupMenu( this );
      popup->insertItem( tr("&Quit"),qApp,SLOT(quit()) );
      menubar->insertItem( tr("&File"),popup );



      對于絕大多數(shù)情況,可以用上述方法處理。不過有時在定義某些變量中使用的字符 串,不能使用上述方法,但是為了讓Qt提取并翻譯該字符串,必須用某種方法標(biāo)志出 來。Qt 定義了 QT_TR_NOOP() 和 QT_TRANSLATE_NOOP() 來標(biāo)志它們。前者用于單個字符串,后者用于多個字符串。比如,



      static const char* strings[] = {
      QT_TR_NOOP( "Hello" ),
      QT_TR_NOOP( "World" )
      };



      有時需要使用printf/sprintf之類的函數(shù)動態(tài)生成字符串,比如,



      QStings s;
      s.sprintf( "Button %d",i );
      but->setText( s );


      對這種使用方式的國際化是使用 arg() 函數(shù)。



      QString s = tr( "Button %1" ).arg(i);
      but->setText( s );



      提取上述信息的方法是使用 Qt 提供的工具 findtr 命令:



      findtr [filename].cpp > i18n.po


      它類似于GNU的 xgettext,上述文件的提取信息文件內(nèi)包含,



      ....
      "Content-Type: text/plain; charset=iso-8859-1\n"

      #: i18n.cpp:34
      msgid "ExampleWidget::&File"
      msgstr ""
      ...



      接下來是文本翻譯過程。 在Qt中翻譯信息文件時應(yīng)該注意以下事項(xiàng): (1) 提取的信息文件的編碼是iso-8859-1,在翻譯成某種語言(編碼)時應(yīng)該 注意改動它的 字符集,比如對中文GB2312和Big5編碼,應(yīng)該是, "Content-Type: text/plain; charset=gb2312\n"或者"Content-Type: text/plain; charset=big5\n"。 (2) 提取的信息有一個范圍,比如上面的文件指定的范圍是 ExampleWidget, 在翻譯 前應(yīng)該把它去掉,變成 msgid "::&File"。(3) 被翻譯的字符串可能含有加速鍵符號,如 "&File"中的"F",如果翻譯成中文最好保留該信息,它可以翻譯成 "文件(&F)"。

      對于翻譯后的文件(比如上面的翻譯文件存為 i18n_gb.po),必須使用 Qt 提供的 工具 msg2qm 把它轉(zhuǎn)換為 .qm 文件才能使用,



      > msg2qm i18n_gb.po i18n_gb.qm



      它類似于GNU的 msgfmt 命令。翻譯后的文件可以用Qt程序直接調(diào)用。



      QTranslator *translator = new QTranslator(0);
      translator->load("i18n_gb.qm",".");
      qApp->installTranslator(translator);



      此外,Qt 還提供了類似于 msgmerge 的工具 mergetr,它用于把新提取的信息 文件和已經(jīng)翻譯過的信息文件融合起來,在此不再贅述。

      在 Qt 中也可以直接使用 QTextCodec 來轉(zhuǎn)換字符串的編碼,這為在Qt下開發(fā)純 中文軟件帶來了便利條件,不過這種方法不符和國際化/本地化的習(xí)慣,



      char *string = "中文和English混和字符串!"
      QTextCodec* gbk_codec = QTextCodec::codecByName("GBK");
      QString gbk_string = codec->toUnicode(string);
      QLabel *label = new QLabel(gbk_string);



      如果使程序只支持一種編碼,也可以直接把整個應(yīng)用程序的編碼設(shè)置為GBK編碼, 然后在字符串之前 加tr(QObject::tr),



      qApp->setDefaultCodec( QTextCodec::codecForName("GBK") );
      QLabel *label = new QLabel( tr("中文標(biāo)簽") );



      如果使Qt根據(jù)Locale的環(huán)境變量取得字符集,可以使用 QString::fromLocal8Bit(str)。

      本節(jié)的例子請參見 qt-i18n-example.tar.gz

      2. Qt 的文本輸入
      在輸入方面,Qt 的輸入條(QLineEdit)和編輯區(qū)(QMultiLineEdit)都支持 XIM,只要配合相應(yīng)的輸入服務(wù)器,便可以輸入中文/日文/韓文。目前有許多支持XIM的軟件,比如 中文: Chinput/xcin/rfinput/q9,日文: kinput2/skkinput,韓文: ami/hanIM。

      Qt程序的缺省輸入風(fēng)格是OverTheSpot風(fēng)格,它也支持 OffTheSpot風(fēng)格和 Root風(fēng)格。 用戶可以在起動程序時在命令行指定輸入風(fēng)格,比如對程序app,



      ./app -inputstyle overthespot #缺省風(fēng)格,光標(biāo)跟隨
      ./app -inputstyle offthespot
      ./app -inputstyle root



      經(jīng)過 MiziLinux 補(bǔ)丁的Qt-2.2.0 支持 OnTheSpot 輸入風(fēng)格,并且把它作為 缺省的輸 入風(fēng)格。請參見 http://www./ko/kde/doc/onthespot/onthespot.html

      Qt 中的任何一個 Widget 都可以接受輸入,只要它可以有鍵盤聚焦(Keyboard Focus)。所以對特殊 Widget 的輸入處理只需要截獲鍵盤輸入,獲取從XIM服務(wù)器 來的字符串。 對于OverTheSport風(fēng)格的支持,刷新XIM輸入服務(wù)器的位置即可。

      3. Qt 的打印


      在打印方面,XWindow下的 Qt 生成PostScript并使用lpr打印。 它含有QPrinter類, 可以方便地支持輸出頁面的控制。 對于中文打印,必須修正PostScript文件的輸出 部分。

      TOpia中文化

      一:字符集介紹

      我國已經(jīng)頒布了多種中文信息編碼標(biāo)準(zhǔn),常用的有:GB2312-1980、GB12345、GB13000(GBK)以及最新標(biāo)準(zhǔn)GB18030,其中 GB13000是對GB2312的擴(kuò)展,又常被成為GBK,GB18030向下兼容GB2312和GBK,中文WINDOW98、中文WIN2000操作 系統(tǒng)采用的中文字符集是GB2312。

      GB2312字庫僅覆蓋雙字節(jié)部分,存儲位置索引是編碼中每字節(jié)的第8bit置0得來的,如A1A1編碼漢字在字庫中的索引是2121,而非A1A1。以下是它的編碼規(guī)則:

      單字節(jié):00~7F

      雙字節(jié):A1~F7 A1~FE

      GBK的編碼規(guī)則是:

      單字節(jié):00~7F

      雙字節(jié):81~FE 40~7E

      80~FE

      GB18030是最新的漢字編碼標(biāo)準(zhǔn),其編碼為一、二、四變長編碼:

      單字節(jié):00~7F

      雙字節(jié):81~FE 40~7E

      80~FE

      四字節(jié):81~FE 30~39 81~FE 30~39

      Unicode編碼采用等長編碼,二個字節(jié)表示一個字符編碼,對于ASCII碼也采用雙字節(jié)來表示,unicode使用二維空間來描述編碼空間,平面分為256行、256列,對應(yīng)于編碼的高低字節(jié)。



      二:Qt 國際化編程

      在文本顯示上,Qt 使用了Unicode 作為內(nèi)部編碼,為了程序的國際化,通常我們在文本顯示的地方不直接輸入本地字符,用英文代替,比如要編寫一中文界面的 Qt 程序,應(yīng)該在程序中使用英文,程序編寫完成后,把文本提取出來翻譯。對于需要翻譯的地方,首先是在該文本處用tr()函數(shù)標(biāo)識,同時制作出.qm信息文 件,并在程序中加入QTranslator即可。比如我們在某一程序中有如下語句:

      setCaption(tr(“main window”));

      為了能顯示中文,有兩種方法:

      方法一:

      l 修改工程文件,加上TRANSLATIONS = xxx.ts

      l lupdate 工程文件名

      l 用linguist編輯剛生成的xxx.ts文件并保存

      l lrelease 工程文件名 xxx.qm

      l 在main.cpp中加入QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);

      qApp->setFont(font1);

      QTranslator *translator = new QTranslator(0);
      translator->load("xxx.qm",".");
      qApp->installTranslator(translator);
      方法二:

      l findtr 文件名(通常為CPP文件) > xxx.po

      l 編輯po文件,其中charset需由iso-8859-1改為GB2312,然后將“main window”翻譯成“主窗口”

      l msg2qm –scope zh_CN.GB2312 xxx.po xxx.qm

      l 在main.cpp中加入QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);

      qApp->setFont(font1);

      QTranslator *translator = new QTranslator(0);
      translator->load("xxx.qm",".");
      qApp->installTranslator(translator);

      方法三:

      有時我們只是提供給本地用戶使用,無需國際化,QT提供這一支持,在QT中有許多本地字符集同unicode的轉(zhuǎn)換引擎,他們皆為QTextCodec的派生類,如QGbkCodec、QJisCodec, QHebrewCodec等。如:

      QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);

      qApp->setFont(font1);

      QString caption=“主窗口“;

      QTextCodec *gk_codec=QTextCodec::codecForName(“GBK”);

      setCaption(gk_codec->toUnicode(caption));

      從上面可以看出,使用轉(zhuǎn)換引擎可以輕松實(shí)現(xiàn)中文顯示,簡要步驟如下:

      1:修改main.cpp文件,將字體改為unifont

      QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);

      qApp->setFont(font1);

      2:在想漢化的內(nèi)的頭文件中加入QTextCodec指針變量和轉(zhuǎn)換函數(shù)QString mytr(char *)

      #include <qtextcodec.h>

      QTextCodec* gbk;

      QString mytr(const char *);

      3:在想漢化的類的實(shí)現(xiàn)文件中,修改類構(gòu)造函數(shù),加入:

      gbk=QTextCodec::codecForName(“GBK”);

      4:在想漢化的類的實(shí)現(xiàn)文件中,添加mytr函數(shù)代碼

      QString Form1::mytr(const char* chars)

      {

      return gbk->toUnicode(chars,strlen(chars));

      }

      5:在想漢化的類的實(shí)現(xiàn)文件中,用“mytr”替換“tr”

      2004-12-2 測試了上面的方法三,編譯通過,如果將codec成員變量改成QTextCodec派生類變量,編譯將通不過,比如將QTextCodec* gbk;改成QGbkCodec* gbk;編譯將報告此處有語法錯誤。下面是相似的用法:

      1:修改***.cpp文件,在頂部加入codec頭文件

      #include <qgbkcodec.h>

      2:在***.h文件中,加入mytr()函數(shù)聲明

      QString mytr(char* buffer,int size);

      3:在***.cpp文件中,加入mytr()定義

      QString mytr(char* buffer,int size)

      {

      QGbkCodec* gbk=QTextCodec::codeForName(“GBK”);

      return gbk->toUnicode(buffer,size);

      }

      4:在需要顯示中文的地方,使用mytr函數(shù)即可

      5:修改main.cpp文件,將字體改為unifont

      QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);

      qApp->setFont(font1);

      備注:在翻譯或轉(zhuǎn)換之前必須將Unicode字體調(diào)入,否則顯示不出中文,網(wǎng)上相關(guān)文章并未提及這一點(diǎn),如果不顯式裝載該字體,系統(tǒng)默認(rèn)的是Latin1,于是漢字顯不出來。

      備注2:在編譯qt/embedded之前,必須修改qconfig-qpe.h配置文件的內(nèi)容,將與TextCodec相關(guān)的宏定義給去掉,否則QTextCodec::codecForName(“GBK”)將返回NULL指針。

      備注3:使用findtr命令時可同時查找多個文件的tr(),并將查找結(jié)果都放入一個文件內(nèi),源文件以空格隔開即可,另外,生成的.po和.qm文件的文件名最好與工程文件名相同!

      備注4:如果要顯示繁體中文,則需要使用QTextCodec::codecForName(“big5”)。獲取本地的使用語言,用 QTextCodec::locale(),它返回Qstring變量,通常如果是中文本地的話,通常其值為zh_CN.GB2312和 zh_TW.Big5,根據(jù)這個返回字符串,可以加載相應(yīng)的codec。如果程序只支持一種編碼,也可以直接把整個應(yīng)用程序的編碼設(shè)置為一個默認(rèn)的編碼標(biāo) 準(zhǔn),比如系統(tǒng)只需要顯示中文和英文,則可以直接設(shè)置應(yīng)用程序的默認(rèn)編碼標(biāo)準(zhǔn)是GBK,如下使用方法:

      qApp->setDefaultCodec( QTextCodec::codecForName("GBK") );

      QLabel *label = new QLabel( tr("中文標(biāo)簽") );

      備注5:如果使用本地的字符轉(zhuǎn)換器,可以使用Qstring的靜態(tài)函數(shù)Qstring::fromLocal8Bit(char* buffer,int size),將本地字符串轉(zhuǎn)換成UNICODE字符串,不過要設(shè)置好LANGUAGE環(huán)境變量。



      三:QTOpia中文化

      l findtr 文件名 > xxx.po

      l 編輯xxx.po文件

      l msg2qm –scope zh_CN.GB2312 xxx.po xxx.qm

      l 拷貝可執(zhí)行文件到QPEDIR/bin目錄

      l 拷貝xxx.po和xxx.qm文件到QPEDIR/i18n/zh_CN目錄

      l 進(jìn)入QPEDIR/apps/Applications目錄創(chuàng)建一新.desktop文件

      l iconv –f utf8 –t GB18030 xxx.desktop > xxx1.desktop

      l 編輯xxx1.desktop文件,主要是修改Exec、Icon、Name和Name[zh_CN]四項(xiàng)

      l iconv –f GB18030 –t utf8 xxx1.desktop > xxx.desktop

      l rm –f xxx1.desktop

      l qvfb –depth 16 &

      l cd $QPEDIR/bin

      l ./qpe

      備注:如果你的系統(tǒng)中有多個qtopia版本,要特別注意QTDIR、QPEDIR、LD_LIBRARY_PATH環(huán)境變量

      備注2:可按照此方法漢化qtopia自帶的應(yīng)用程序

      備注3:po文件是中間文件,程序真正需要的是qm文件。iconv是系統(tǒng)自帶的內(nèi)碼轉(zhuǎn)換工具,它能將utf8編碼的文件轉(zhuǎn)換成gb18030編碼的文 件,反之也能,轉(zhuǎn)換這一步必不可少,因?yàn)閐esktop文件缺省是utf8編碼的,而我們的redhat linux 7。3中文操作系統(tǒng)用的卻是gb18030,所以在編輯器打開前需轉(zhuǎn)換。



      四:漢化qtopia-1.5.0 for Arm

      首先按照“三”的方法對要漢化的程序提取*.qm文件和*.desktop桌面配置文件,在做完這一步后,將*.qm文件down到目標(biāo)機(jī)的 /opt/qtopia-free-1.5.0.arm/i18n/zh_CN目錄下,同時將*.desktop文件覆蓋/opt/qtopia- free-1.5.0.arm/apps目錄下的相應(yīng)文件,目標(biāo)機(jī)的環(huán)境變量配置如下:

      export QTDIR=/opt/qt-2.3.3.arm

      export QPEDIR=/opt/qtopia-free-1.5.0.arm

      export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

      export PATH=$QPEDIR/bin:$PATH

      export LANG=zh_CN

      開機(jī)啟動,由于設(shè)置的語言為簡體中文,qpe會自動為每個應(yīng)用加載Unifont字體,以及簡體中文目錄下的翻譯文件,因而顯示出中文,翻譯文件是一個方 面,但更關(guān)鍵的是要顯示中文必須有中文字體來支持,Unifont字體包含中文字,因而能顯示中文,沒有相應(yīng)字體的支持,光有翻譯文件是顯示不出中文的!

      在經(jīng)過以上的步驟后,有的應(yīng)用在顯示上依然會顯示方框,這多半是由于該窗體相關(guān)的字體可能不是支持中文的字體,這需要直接修改源代碼,以下是在漢化qtopia-free-1.5.0.arm的過程中的相關(guān)記錄:

      1. 在編譯qtopia的過程中,可能會報告找不到SetButtonGroupID()函數(shù),編譯通不過。這是由于庫中并沒有該函數(shù),一般情況下將該語句隱 藏掉,原代碼的原意是設(shè)置Button按鈕在ButtonGroup組的序號,隱藏該語句對應(yīng)用無影響。出現(xiàn)這個問題,主要在 /netsetup/dialup/dialupbase.cpp文件和/taskbar/shutdown.cpp文件,shutdown.cpp文件 的相應(yīng)行號是:96、149、201、253行。

      2. 修改mpegplayer/playlistwidget.cpp文件的143行和166行,將字體設(shè)置改為Unifont,如下:Qfont(“unifont”,16,50,FALSE,QFont::Unicode)或者去掉該語句

      3. 修改snake/interface.cpp的87行和186行,將字體設(shè)置改為Unifont,如下:Qfont(“unifont”,16,50,FALSE,QFont::Unicode)或者去掉該語句

      4. 修改qasteroids/view.cpp的104行和qasteroids/toplevel.cpp的109行和165行,將字體設(shè)置改為 Unifont,如下:Qfont(“unifont”,16,50,FALSE,QFont::Unicode)或者去掉該語句

      5. 修改sysinfo/versioninfo.cpp文件,將61行的builder改為作者本人,將50行的v改為tr(“corpname”),重新建立po文件,并翻譯corpname為國營789北京開發(fā)部,使用msg2qm生成qm文件

      6. 修改桌面,位于taskbar目錄下,生成libqpe.po和libqpe.qm文件,并將libqpe.qm文件拷貝到i18n/zh_CN目錄下



      五:qtopia目錄結(jié)構(gòu)

      apps/Applications:應(yīng)用程序桌面配置文件

      apps/Games:游戲桌面配置文件

      apps/Settings:系統(tǒng)設(shè)置桌面配置文件

      bin:二進(jìn)制可執(zhí)行文件

      configs:編譯配置文件目錄

      doc和docs:qtopia的參考文檔

      etc:應(yīng)用配置文件目錄

      i18n:國際化目錄

      i18n/zh_CN:簡體中文目錄

      include/qpe:與qtopia相關(guān)的頭文件目錄

      inputmethods:輸入法

      library:qtopia部分源代碼目錄

      pics:與應(yīng)用相關(guān)的圖片存放目錄

      plugins:各種插件目錄,如mpeg3解碼插件、輸入法插件等

      sounds:音頻文件存放目錄

      taskbar:桌面程序的源代碼(qpe的源代碼)





      文件修改記錄:

      1:創(chuàng)建于2003/6/9

      2:于2003/8/21添加實(shí)現(xiàn)中文顯示的第三種方法部分

      3:于2004-1-18添加文章的“四”內(nèi)容,一個漢化qtopia for arm的實(shí)例,以及“五”。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多