嵌入式qt的安裝和應用 (2)

系統是完全安裝RedHat9.0(裏面帶QT3.1),板子是X-Hyper250B的,Toolchain用的是開發板帶的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

主機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 (因爲解壓後的qt-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 ==>>我都是這樣創建.pro文件的
$tmake -o Makefile hello.pro
$make
$qvfb &
$./hello -qws 或者$qpe
還沒怎麼仔細研究過。


目標機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裏面包含這個庫;如沒有可以上網下載。

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.wleda.com/?p=20 這裏面的大哥呀,好不容易纔在網上找到的)
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環境下qt中文化程序設計

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


kdevelop是一款在linux平臺下可以同windows環境下的vc相媲美的集成開發環境,qt則是一款支持包括windows和linux平臺
的GUI庫,可以說它是linux下的MFC.在顯示上,qt使用Unicode作爲內部編碼,可以支持多種編碼.如何使用qt進行國際化編程
在網上可以找到很多資料的,但都是針對較早版本的qt進行介紹的.qt3.0.5中對這些作了些改動,這些方法就相應的要做些改動.
而且在kdevelop中開發qt應用程序,將會事半功倍.我的開發環境爲redhat8.0(需安裝kde開發工具包).
首先在linux中打開kdevelop集成開發環境,用它的應用程序嚮導新建一個qt的SDI的應用程序框架.這個同windows下vc很類似.它
將會爲你自動生成版本號,作者,e-mail等信息的單文檔對話框的應用程序框架.我們首先對它自動生成的程序進行漢化(qt1是
我的項目名稱).
1.漢化自動生成的程序
添加翻譯文件
在"項目"菜單中選擇"添加新的翻譯文件",語言選擇"zh_CN.Gb2312".將會創建一個zh_CN.GB2312字符編碼的翻譯文件.擴展名
爲".ts".在qt3.0.5環境下,打開"*.ts"翻譯文件的工具是linguist.你可以在"工具"菜單中選擇"QT
linguist"來打開,在linguist菜單中選擇"file"->"open"打開所要翻譯的翻譯文件.此時可以在linguist窗口中的source text中
的文本就是你所要翻譯的文本,選擇所要翻譯的文本,在下方有一個類似一頁紙一樣的地方,在translate下輸入翻譯後的文本.
所示.
翻譯完這些文件後,編譯運行,在我們的程序裏並不能顯示中文,還是英文,我們還需要做的就是用lrelease命令將翻譯後的文件轉換
成".qm"文件纔可以使用.在控制檯下進入你用kdevelop所生成的應用程序目錄.
>lrelease Makefile.am
qt3.0.5用這個兩個程序取代了以前版本的findtr和msg2qm命令.在kdevelop集成環境中打開main.cpp主函數,
......
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(), "." );
是根據客戶環境的locale來載入當前目錄下相應的翻譯文件的.redhat中文環境默認的locale爲gb18030,
此處要麼把翻譯文件名由qt1.zh_CN.GB2312.qm改爲qt1.zh_CN.GB18030.qm,要麼將這句改爲
tor.load( QString("qt1.zh_CN.GB2312"), "." );
不過爲了國際化編程的需要,建議採用第一種方法.更改後編譯運行,你會發現你的程序已經是中文界面的了.

2.漢化自己的對話框
大多數情況下我們都需要自己來設計對話框,qt爲我們提供了非常好的對話框編輯器QtDesigner,可以很方便的設計我們的對話框,qt
的信號和槽等,關於QtDesigner的使用,限於篇幅,不再贅述.以前面的程序爲基礎.在kdevelop中選擇"文件"->"新建",選擇Qt
Designer文件(*.ui).在文件名一欄中填寫"mydialog",最後點擊確定按鈕,即會啓動QtDesigner,此處只拖了一個Label,寫了一
些英文字符.對話框的name屬性爲Form1.將對話框mydialog.ui保存.
在控制檯下進入你用kdevelop所生成的應用程序目錄.
>lupdate Makefile.am
同樣用"QT
linguist"來翻譯qt1.zh_CN.GB2312.tr文件.此時linguist的context中會多出Form1的選項,這裏面就是我們新建的對話框要翻譯的
選項.依據前面的方法進行漢化.
>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
進去.依據前面的方法更改tor.load中加載的翻譯文件.編譯運行,你的對話框也是中文的了.

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

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

5. QCString&QString
QCString中不以unicode編碼
QString以unicode爲編碼.
qt內部使用unicode爲編碼,所以如果要在qt的部件如multilineedit中顯示中文,則需要將非unicode的字符轉換成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 國際化編程

 


內容:

1. Qt 的文本顯示

2. Qt 的文本輸入

3. Qt 的打印

對本文的評價

 

訂閱:

developerWorks 時事通訊

 

 


於明儉
 
2002 年 1 月 09 日

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

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

在文本輸入上,Qt 採用了XIM(X Input Method)標準協議,可以直接使用XIM輸入服務器。由於目前的絕大多數輸入服務器都是針對單一語言的,所以在 Qt 的標準輸入組件( QLineEdit,QMultiLineEdit)中的輸入受到單一編碼的限制,Qt 還不支持動態切換編碼輸入的支持,這是它的不足之處。

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

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

 

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

 

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

 

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

 

有時需要使用printf/sprintf之類的函數動態生成字符串,比如,

 

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


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

 

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

 

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

 

findtr [filename].cpp > i18n.po


它類似於GNU的 xgettext,上述文件的提取信息文件內包含,

 

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

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

 

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

對於翻譯後的文件(比如上面的翻譯文件存爲 i18n_gb.po),必須使用 Qt 提供的 工具 msg2qm 把它轉換爲 .qm 文件才能使用,

 

> msg2qm i18n_gb.po i18n_gb.qm

 

它類似於GNU的 msgfmt 命令。翻譯後的文件可以用Qt程序直接調用。

 

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

 

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

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

 

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

 

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

 

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

 

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

本節的例子請參見 qt-i18n-example.tar.gz

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

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

 

./app -inputstyle overthespot #缺省風格,光標跟隨
./app -inputstyle offthespot
./app -inputstyle root

 

經過 MiziLinux 補丁的Qt-2.2.0 支持 OnTheSpot 輸入風格,並且把它作爲 缺省的輸 入風格。請參見 http://www.mizi.com/ko/kde/doc/onthespot/onthespot.html

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

3. Qt 的打印


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

TOpia中文化

一:字符集介紹

我國已經頒佈了多種中文信息編碼標準,常用的有:GB2312-1980、GB12345、GB13000(GBK)以及最新標準GB18030,其中 GB13000是對GB2312的擴展,又常被成爲GBK,GB18030向下兼容GB2312和GBK,中文WINDOW98、中文WIN2000操作系統採用的中文字符集是GB2312。

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

單字節:00~7F

雙字節:A1~F7 A1~FE

GBK的編碼規則是:

單字節:00~7F

雙字節:81~FE 40~7E

80~FE

GB18030是最新的漢字編碼標準,其編碼爲一、二、四變長編碼:

單字節:00~7F

雙字節:81~FE 40~7E

80~FE

四字節:81~FE 30~39 81~FE 30~39

Unicode編碼採用等長編碼,二個字節表示一個字符編碼,對於ASCII碼也採用雙字節來表示,unicode使用二維空間來描述編碼空間,平面分爲256行、256列,對應於編碼的高低字節。

 

二:Qt 國際化編程

在文本顯示上,Qt 使用了Unicode 作爲內部編碼,爲了程序的國際化,通常我們在文本顯示的地方不直接輸入本地字符,用英文代替,比如要編寫一中文界面的 Qt 程序,應該在程序中使用英文,程序編寫完成後,把文本提取出來翻譯。對於需要翻譯的地方,首先是在該文本處用tr()函數標識,同時製作出.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的轉換引擎,他們皆爲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));

從上面可以看出,使用轉換引擎可以輕鬆實現中文顯示,簡要步驟如下:

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

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

qApp->setFont(font1);

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

#include <qtextcodec.h>

QTextCodec* gbk;

QString mytr(const char *);

3:在想漢化的類的實現文件中,修改類構造函數,加入:

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

4:在想漢化的類的實現文件中,添加mytr函數代碼

QString Form1::mytr(const char* chars)

{

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

}

5:在想漢化的類的實現文件中,用“mytr”替換“tr”

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

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

#include <qgbkcodec.h>

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

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函數即可

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

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

qApp->setFont(font1);

備註:在翻譯或轉換之前必須將Unicode字體調入,否則顯示不出中文,網上相關文章並未提及這一點,如果不顯式裝載該字體,系統默認的是Latin1,於是漢字顯不出來。

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

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

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

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

QLabel *label = new QLabel( tr("中文標籤") );

備註5:如果使用本地的字符轉換器,可以使用Qstring的靜態函數Qstring::fromLocal8Bit(char* buffer,int size),將本地字符串轉換成UNICODE字符串,不過要設置好LANGUAGE環境變量。

 

三:QTOpia中文化

l findtr 文件名 > xxx.po

l 編輯xxx.po文件

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

l 拷貝可執行文件到QPEDIR/bin目錄

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

l 進入QPEDIR/apps/Applications目錄創建一新.desktop文件

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

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

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

備註:如果你的系統中有多個qtopia版本,要特別注意QTDIR、QPEDIR、LD_LIBRARY_PATH環境變量

備註2:可按照此方法漢化qtopia自帶的應用程序

備註3:po文件是中間文件,程序真正需要的是qm文件。iconv是系統自帶的內碼轉換工具,它能將utf8編碼的文件轉換成gb18030編碼的文件,反之也能,轉換這一步必不可少,因爲desktop文件缺省是utf8編碼的,而我們的redhat linux 7。3中文操作系統用的卻是gb18030,所以在編輯器打開前需轉換。

 

四:漢化qtopia-1.5.0 for Arm

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

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

開機啓動,由於設置的語言爲簡體中文,qpe會自動爲每個應用加載Unifont字體,以及簡體中文目錄下的翻譯文件,因而顯示出中文,翻譯文件是一個方面,但更關鍵的是要顯示中文必須有中文字體來支持,Unifont字體包含中文字,因而能顯示中文,沒有相應字體的支持,光有翻譯文件是顯示不出中文的!

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

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

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

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

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

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

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

 

五:qtopia目錄結構

apps/Applications:應用程序桌面配置文件

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

apps/Settings:系統設置桌面配置文件

bin:二進制可執行文件

configs:編譯配置文件目錄

doc和docs:qtopia的參考文檔

etc:應用配置文件目錄

i18n:國際化目錄

i18n/zh_CN:簡體中文目錄

include/qpe:與qtopia相關的頭文件目錄

inputmethods:輸入法

library:qtopia部分源代碼目錄

pics:與應用相關的圖片存放目錄

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

sounds:音頻文件存放目錄

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

 

 

文件修改記錄:

1:創建於2003/6/9

2:於2003/8/21添加實現中文顯示的第三種方法部分

3:於2004-1-18添加文章的“四”內容,一個漢化qtopia for arm的實例,以及“五”。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章