1. 在程式中所有要翻譯的文字都必須在 QObject::tr()之中
ex:
QMessageBox msgb(this);
msgb.setWindowTitle(tr("Illegal"));
msgb.setText(tr("Illegal product!"));
msgb.setIcon(QMessageBox::Warning);
msgb.exec();
2. 在.pro檔中,設定預計產生的翻譯檔語系名稱及其位置 (本例名稱為 test.pro)
ex:
TRANSLATIONS += ./translations/test_en.ts ./translations/test_tw.ts ./translations/test_jp.ts ./translations/test_cn.ts
3. 執行 lupdate 產生 .ts檔
ex:
lupdate test.pro
4. 使用 Qt Linguist 編輯.ts檔
5. 使用 lrelease 產生 .qm檔
ex:
lrelease ./translations/*.ts
6. copy .qm檔到你所指定的目錄
ex: cp -ax ./translations/*.qm /home/daniel/language/qm/*
7. 在主程式 main當中,依據需求載入你所需的qm檔
ex:
QTranslator translator, defTrans;
QLocale g_sysLocale;
//繁體中文
translator.load("test_tw", "/home/daniel/language/qm");
defTrans.load("qt_zh_TW", "/home/daniel/language/qm");
app.installTranslator(&translator);
app.installTranslator(&defTrans);
g_sysLocale = QLocale(QLocale::Chinese, QLocale::Taiwan);
// 簡體中文
/*
translator.load("test_cn", "/home/daniel/language/qm");
defTrans.load("qt_zh_CN", "/home/daniel/language/qm");
app.installTranslator(&translator);
app.installTranslator(&defTrans);
g_sysLocale = QLocale(QLocale::Chinese, QLocale::China);
*/
QLocale::setDefault(g_sysLocale);
MainWindow mainWin(0);
mainWin.setLocale(g_sysLocale);
mainWin.start();
return app.exec();
8. 所有包在 QObject::tr()中的字串,就會依照所載入的qm檔,做文字置換動作
搜尋此網誌
2011年9月29日 星期四
2011年9月19日 星期一
如何在QT中將QVariant轉換成定義在QtGui中的資料型態 (如 QColor...等),或自定型別
因為QVariant是QtCore庫的一部分,它不能夠提供定義在QtGui當中的類型(如 QColor)的轉換
如要轉換,方法式將其轉換至指定的樣版型別,如下所示,(PS:自訂型別方法相同):
QColor color = variant.value();
不過在轉換之前最好先用canConvert()的函式來檢查是否可提供該型別轉換,如下所示:
if (variant.canConvert()) {
QColor color = variant.value();
}
反向轉換(如把QColor轉成QVariant)則和一般的型態(非定義在QtCui或自訂型別)是一樣的
如要轉換,方法式將其轉換至指定的樣版型別,如下所示,(PS:自訂型別方法相同):
QColor color = variant.value
不過在轉換之前最好先用canConvert()的函式來檢查是否可提供該型別轉換,如下所示:
if (variant.canConvert
QColor color = variant.value
}
反向轉換(如把QColor轉成QVariant)則和一般的型態(非定義在QtCui或自訂型別)是一樣的
2011年6月14日 星期二
在QT中如何在QApplication中攔截X11 的事件
1. 繼承 QApplication, 並改寫 x11EventFilter virtual function .
class NewApplication : public QApplication
{
Q_OBJECT
public:
NewApplication(int& argc, char ** argv);
virtual bool x11EventFilter(XEvent *event);
private:
};
bool NewApplication::x11EventFilter(XEvent *event)
{
switch (event->type) {
case ButtonPress:
{
if (event->xbutton.button == 2) {
// 攔截中鍵 ... 寫你要的動作
}
}
case ButtonRelease:
case KeyPress:
case KeyRelease:
case MotionNotify:
};
return NewApplication::x11EventFilter(event);
}
2. 在mail裡面把建立QApplication改成建立NewApplication
QApplication app(argc, argv);
改成
NewApplication app(argc, argv);
3. start app
app.exec();
class NewApplication : public QApplication
{
Q_OBJECT
public:
NewApplication(int& argc, char ** argv);
virtual bool x11EventFilter(XEvent *event);
private:
};
bool NewApplication::x11EventFilter(XEvent *event)
{
switch (event->type) {
case ButtonPress:
{
if (event->xbutton.button == 2) {
// 攔截中鍵 ... 寫你要的動作
}
}
case ButtonRelease:
case KeyPress:
case KeyRelease:
case MotionNotify:
};
return NewApplication::x11EventFilter(event);
}
2. 在mail裡面把建立QApplication改成建立NewApplication
QApplication app(argc, argv);
改成
NewApplication app(argc, argv);
3. start app
app.exec();
2011年3月18日 星期五
台灣新三寶
宅男有三寶:科技、女優、人真好 型男有三寶:親親、抱抱、再推倒 周董有三寶:唉呦、不錯、這個屌 韓劇有三寶:車禍、癌症、醫不好 台客有三寶:拎娘、G8、 跨啥小 威武有三寶:蜆精、大鵰、愛福好 謊言有三寶:天長、地久、愛到老 謊言再三寶:海枯、石爛、你最好 老師有三寶:劃線、重要、這會考 國小有三寶:起立、立正、老師好 國中有三寶:腦殘、白目、愛耍屌 高中有三寶:補習、熬夜、拼聯考 大學生有三寶:複製、貼上、過就好 大學男生有三寶:聯誼、把咩、學妹好 大學女生有三寶:化妝、打扮、穿的少 上班族有三寶:上班、下班、公司倒 海綿寶寶有三寶:小蝸、水母、愛蟹堡 海綿寶寶再三寶:章魚、海星、比奇堡 成人頻道有三寶:彩虹、星穎、新東寶 台灣的網路有三寶: 斷線、LAG、........修不好
2010年6月23日 星期三
如何將整數值放入Char陣列中,並還原其值
為何要將16進制的值放入char陣列裡面呢?
主要是用在通訊系統,一般而言我們透過序列埠傳送資料時只能傳送BYTE array的資料,所以當我們要傳送一個整數的資料時,就必須將整數資料放在BYTE array中傳送.
但要如何將整數資料放在 BYTE array中呢?
一般方法有兩種
1. 轉成16進制字元陣列 (較節省空間,但運算較複雜)
2. 採用BCD編碼傳送 (較直覺,但浪費空間)
16進制字元陣列:
例如有一個值為 1454591794 其16進制為 0x56B34F32;
我們可以宣告一個char的陣列其大小為4 , 如 char hexStr[4]來儲存; (4個byte剛好為一個int)
其內容分別為 hexStr[0] = 0x32, hexStr[1] = 0x4F, hexStr[2] = 0xB3, hexStr[3] = 0x56
反之我們可以使用下面的方法將 16進制char陣列 還原成int的值
unsigned int tt = (unsigned int) hexStr[0];
unsigned int t2;
tt <<= 24;
t2 = (unsigned int) hexStr[1];
tt |= (t2 << 16);
t2 = (unsigned int) hexStr[2];
tt |= (t2 << 8);
t2 = (unsigned int) hexStr[3];
tt |= t2;
其中 tt就是我們要的整數值
BCD方式如下:
假設值為 1454591794
我們可以將其拆解為 0x14 , 0x54, 0x59, 0x17, 0x94
我們可以宣告一個char的陣列其大小為5 , 如 char hexStr[5]來儲存
其內容分別為
hexStr[0] = 0x94, hexStr[1] = 0x17.........hexStr[4] = 0x14
還原整數方法如下:
char Buf[11];
sprintf(Buf, "%02x%02x%02x%02x%02x",
(unsigned char) hexStr[4],
(unsigned char) hexStr[3],
(unsigned char) hexStr[2],
(unsigned char) hexStr[1],
(unsigned char) hexStr[0]);
int i = atoi(Buf);
其中 i就是我們要的整數值
主要是用在通訊系統,一般而言我們透過序列埠傳送資料時只能傳送BYTE array的資料,所以當我們要傳送一個整數的資料時,就必須將整數資料放在BYTE array中傳送.
但要如何將整數資料放在 BYTE array中呢?
一般方法有兩種
1. 轉成16進制字元陣列 (較節省空間,但運算較複雜)
2. 採用BCD編碼傳送 (較直覺,但浪費空間)
16進制字元陣列:
例如有一個值為 1454591794 其16進制為 0x56B34F32;
我們可以宣告一個char的陣列其大小為4 , 如 char hexStr[4]來儲存; (4個byte剛好為一個int)
其內容分別為 hexStr[0] = 0x32, hexStr[1] = 0x4F, hexStr[2] = 0xB3, hexStr[3] = 0x56
反之我們可以使用下面的方法將 16進制char陣列 還原成int的值
unsigned int tt = (unsigned int) hexStr[0];
unsigned int t2;
tt <<= 24;
t2 = (unsigned int) hexStr[1];
tt |= (t2 << 16);
t2 = (unsigned int) hexStr[2];
tt |= (t2 << 8);
t2 = (unsigned int) hexStr[3];
tt |= t2;
其中 tt就是我們要的整數值
BCD方式如下:
假設值為 1454591794
我們可以將其拆解為 0x14 , 0x54, 0x59, 0x17, 0x94
我們可以宣告一個char的陣列其大小為5 , 如 char hexStr[5]來儲存
其內容分別為
hexStr[0] = 0x94, hexStr[1] = 0x17.........hexStr[4] = 0x14
還原整數方法如下:
char Buf[11];
sprintf(Buf, "%02x%02x%02x%02x%02x",
(unsigned char) hexStr[4],
(unsigned char) hexStr[3],
(unsigned char) hexStr[2],
(unsigned char) hexStr[1],
(unsigned char) hexStr[0]);
int i = atoi(Buf);
其中 i就是我們要的整數值
2010年4月25日 星期日
肚皮舞者
2010年4月18日 星期日
走向共和
訂閱:
文章 (Atom)



