天天看點

嵌入式Qt方案中文顯示系列:Qte中的字型支援和使

來源: http://my.oschina.net/shelllife/blog/119215      http://www.cppblog.com/biao/archive/2012/01/01/163345.html

前話:工作以來在項目中主要的開發工作都是用嵌入式QT開發界面,從一開始的從零摸索,到現在有點頭緒和經驗,很多東西和用法依然隻是知其然,不知其是以然,甚至一些還僅僅是模仿階段。在這期間,學的東西很零散,是以現在有一次做這塊,打算弄明白一些東西,也算對自己付出的時間有個交待。

使用嵌入式Qt作為嵌入式GUI的解決方案,其實會比較輕松,除了幾個不多的難點,就我目前的經驗,一個是資源占用問題,對于資源緊張的系統優化會比較難,一個是中文顯示的問題,這個也是我第一次花的時間很多的一塊,網上這塊的資料很多,說明問題比較普遍。現在回過頭來看,實際上也不是那麼難搞定。這裡就中文顯示寫幾遍學習了解的文章,即為自己,也友善後來者。

支援的字型

嵌入式Qt支援4中格式的字型,分别是:

  • TrueType(TTF)   可縮放字型格式,桌面系統中主要使用的字型
  • PostscripType(PFA/PFB)  可縮放字型格式,列印主要使用的字型,可TTF類似
  • Bitmap Distribution Format fonts (BDF)  不可縮放字型的标準格式,在X11平台系統中可以找到
  • Qt Prerendered Font (QPF)  Qt預渲染字型,專用于嵌入式Qt的一種字型格式

QPF字型格式是嵌入式Qt内置支援的字型,可以使用QT SDK中提供的makeqpf工具利用前三種字型檔案來生成。而其它的字型格式是否支援則是可以進行裁剪定制的,可以去掉對TTF、BDF字型的支援以降低Qte庫的空間占用,通過定義下面的Qt特性宏:

view source print ?

1

4

#define QT_NO_TRUETYPE   

5

6

9

#define QT_NO_BDF

當然,不定義這兩個宏則表示支援TTF、BDF字型。

因為QPF是預渲染的,嵌入式Qt使用它時不需要讀取和解析它,隻需要進行簡單快速的映射,是以它對記憶體的消耗是最小的。是以一種方法是利用TTF和BDF字型檔案制作好需要的QPF字型檔案,然後移除對兩者的支援。

TTF、PFA和QPF字型都支援字型的反走樣,即使字型盡量顯示的圓滑而不會有鋸齒感,進而提供更好的可讀性和觀感,特别是在低分辨率裝置上,但是這是以消耗更多的記憶體和空間為代價的,大概是不反走樣的八倍。

對于所有的字型檔案,嵌入式Qt都是使用Unicode編碼的格式。

使用字型檔案

當Qte應用運作時,它會到以下兩個目标之一去尋找規定的字型定義檔案fontdir:

  • $QTDIR/lib/fonts/fontdir    QTDIR是一般使用Qte都會定義的環境變量
  • /usr/local/qt-embedded/lib/fonts/fontdir  可能是預設的qte安裝路徑

fontdir檔案定義了Qte應用可以使用的字型格式、大小和檔案等内容。fontdir檔案的内容和字型條目定義的格式可以參考如下的示例檔案,檔案中有相應的說明:

view source print ?

01

# see fonts-qws.html for mor information on this file.

02

# format is

03

#

04

# name file renderer italic weight size [flags [sizerange]]

05

#

06

# set size as 0 to use sizerange.  flags are option if no sizerange

07

# name is the name of the resulting font

08

# file is the file to generate or render the font from

09

# renderer is either FT or BDF indicating the rendering engine to use

10

# italic is y for an italic font, n for not italic

11

# weight is 50 for regular font, 75 for bold

12

# size is 10* point size.  e.g. 120 for 12pt font.

13

# flags include

14

#    u = unicode font.  characters from 0-65535

15

#    a = ascii font.  characters from 0-127

16

#      <neither of the above is font with characters 0-255>

17

#    s = smooth or blended font.

18

# flags is optional if no sizerange is to be used (size is 0)

19

# sizerange is optional unless size is 0.

20

#    sizerange is comma separated list of font sizes to generate

21

#

22

helvetica helvB08.bdf BDF n 75 80 u

23

helvetica helvBO08.bdf BDF y 75 80 u

24

helvetica helvO08.bdf BDF y 50 80 u

25

helvetica helvR08.bdf BDF n 50 80 u

26

# Unifont is available in source form from http://czyborra.com/unifont/

27

unifont unifont.bdf BDF n 50 160 u

你可以在檔案中添加其它的字型格式條目,前提是你有相應的字型檔案,不然加了也沒用。

關于檔案中的渲染引擎renderer

上面也提到了,renderer隻能是BDF或者FT,BDF對應BDF字型檔案,而FT是FreeType的縮寫,FreeType是一個強大的庫用來實作渲染TTF/TTC和PFA字型,在嵌入式QT庫的編譯配置時可以選擇是否支援。注意到沒有QPF渲染引擎的說法,這是因為QPF字型檔案的使用是不需要在fontdir檔案中定義的,隻需要将QPF字型檔案放到和fontdir檔案同一級目錄下就可以,但是QPF字型檔案的命名必須符合Qte的規範:

view source print ?

1

name_size_weightitalicflag.qpf

2

3

e.g:

4

wenquanyi_160_75.qpf   16pt文泉驿粗體,不支援斜體

5

wenquanyi_160_50i.qpf  16pt文泉驿正常,支援斜體

關于檔案中的字型大小size

size的大小是字型大小*10,也就是12pt字型的size是120,但是我對pt這個機關沒有什麼概念,是以我特意查找對比了一下字型大小的機關表示,整理如下:

view source print ?

1

小五号:9pt, 五号:10.5pt, 小四号:12pt

2

四号:13.75pt(磅), 三号:15.75pt(磅), 二号:21pt

3

中文最小字号:八号;2.83pt = 1mm, 28.3pt = 1cm = 一号字型(27.5pt)

4

字型大小對應的點陣:

5

9pt:12*12(96dpi),15*15(120dpi); 

6

12pt: 15*15(96dpi),19*19(120dpi)

不過在實際的嵌入式裝置上顯示時好像和這種字型大小在word上的顯示不太一緻,如前面的16pt文泉驿字型在裝置上顯示的大小感覺和word中的小四号字型差不多大。

關于中文字型支援

步入重點,如果需要支援中文字型,顯然就需要有對應的中文字型檔案。前面提到的unifont.bdf檔案和文泉驿字型檔案都是可以支援中文的,也可以從對應的網站上下載下傳到官方的字型檔案。而文泉驿字型在Linux系統X11平台上也是使用的比較多的,是以可以直接取用。

關于QPF字型檔案生成的捷徑

前面提到可以使用makeqpf工具通過TTF、BDF字型檔案來生成QPF字型檔案,這就需要編譯makeqpf工具,然後自己一個個去進行相應的轉換,你還可能不确定會使用到哪些字型。另一種更友善快捷的方法是讓Qte應用自動完成需要使用字型的QPF生成,方法就是在運作Qte應用時,加上 -savefonts 選項。此時應用會将所有使用到的非QPF字型自動轉換生成QPF字型檔案并儲存下來。然後你就可以去掉TTF、BDF支援,支援使用QPF字型檔案進行部署了。

說明:關于嵌入式Qt中的字型使用,涉及fontdir字型定義檔案和QPF字型檔案的命名規範等内容可能随着版本的更新會有所變化,這裡參考的是qtopia-2.2的版本,已經比較舊了。在進行開發時一定要參考所使用qte版本的documentation。

參考資料: qtopia-free-2.2.0/qt2/doc/html/fonts-qws.html  qtopia源碼中的文檔

Qt:使用自定義的字型 1. 下載下傳字型檔案 2. 加載字型檔案 3. 使用字型

QFontDatabase::addApplicationFont("XENOTRON.TTF");      
ui->toolButton_2->setFont(QFont("XENOTRON", 34));      
Qt

繼續閱讀