前話:工做以來在項目中主要的開發工做都是用嵌入式QT開發界面,從一開始的從零摸索,到如今有點頭緒和經驗,不少東西和用法依然只是知其然,不知其因此然,甚至一些還僅僅是模仿階段。在這期間,學的東西很零散,因此如今有一次作這塊,打算弄明白一些東西,也算對本身付出的時間有個交待。 html
使用嵌入式Qt做爲嵌入式GUI的解決方案,其實會比較輕鬆,除了幾個很少的難點,就我目前的經驗,一個是資源佔用問題,對於資源緊張的系統優化會比較難,一個是中文顯示的問題,這個也是我第一次花的時間不少的一塊,網上這塊的資料不少,說明問題比較廣泛。如今回過頭來看,實際上也不是那麼難搞定。這裏就中文顯示寫幾遍學習理解的文章,即爲本身,也方便後來者。 shell
嵌入式Qt支持4中格式的字體,分別是: less
QPF字體格式是嵌入式Qt內置支持的字體,可使用QT SDK中提供的makeqpf工具利用前三種字體文件來生成。而其它的字體格式是否支持則是能夠進行裁剪定製的,能夠去掉對TTF、BDF字體的支持以下降Qte庫的空間佔用,經過定義下面的Qt特性宏: 工具
/* TrueType (TTF and TTC) font file format, only used by Qt/Embedded. */ #define QT_NO_TRUETYPE /* Bitmap Distribution Format (BDF) font file format, only used by Qt/Embedded. */ #define QT_NO_BDF
固然,不定義這兩個宏則表示支持TTF、BDF字體。 學習
由於QPF是預渲染的,嵌入式Qt使用它時不須要讀取和解析它,只須要進行簡單快速的映射,所以它對內存的消耗是最小的。所以一種方法是利用TTF和BDF字體文件製做好須要的QPF字體文件,而後移除對二者的支持。 字體
TTF、PFA和QPF字體都支持字體的反走樣,即便字體儘可能顯示的圓滑而不會有鋸齒感,從而提供更好的可讀性和觀感,特別是在低分辨率設備上,可是這是以消耗更多的內存和空間爲代價的,大概是不反走樣的八倍。 優化
對於全部的字體文件,嵌入式Qt都是使用Unicode編碼的格式。 網站
當Qte應用運行時,它會到如下兩個目標之一去尋找規定的字體定義文件fontdir: this
fontdir文件定義了Qte應用可使用的字體格式、大小和文件等內容。fontdir文件的內容和字體條目定義的格式能夠參考以下的示例文件,文件中有相應的說明: 編碼
# see fonts-qws.html for mor information on this file. # format is # # name file renderer italic weight size [flags [sizerange]] # # set size as 0 to use sizerange. flags are option if no sizerange # name is the name of the resulting font # file is the file to generate or render the font from # renderer is either FT or BDF indicating the rendering engine to use # italic is y for an italic font, n for not italic # weight is 50 for regular font, 75 for bold # size is 10* point size. e.g. 120 for 12pt font. # flags include # u = unicode font. characters from 0-65535 # a = ascii font. characters from 0-127 # <neither of the above is font with characters 0-255> # s = smooth or blended font. # flags is optional if no sizerange is to be used (size is 0) # sizerange is optional unless size is 0. # sizerange is comma separated list of font sizes to generate # helvetica helvB08.bdf BDF n 75 80 u helvetica helvBO08.bdf BDF y 75 80 u helvetica helvO08.bdf BDF y 50 80 u helvetica helvR08.bdf BDF n 50 80 u # Unifont is available in source form from http://czyborra.com/unifont/ unifont unifont.bdf BDF n 50 160 u
你能夠在文件中添加其它的字體格式條目,前提是你有相應的字體文件,否則加了也沒用。
上面也提到了,renderer只能是BDF或者FT,BDF對應BDF字體文件,而FT是FreeType的縮寫,FreeType是一個強大的庫用來實現渲染TTF/TTC和PFA字體,在嵌入式QT庫的編譯配置時能夠選擇是否支持。注意到沒有QPF渲染引擎的說法,這是由於QPF字體文件的使用是不須要在fontdir文件中定義的,只須要將QPF字體文件放到和fontdir文件同一級目錄下就能夠,可是QPF字體文件的命名必須符合Qte的規範:
name_size_weightitalicflag.qpf e.g: wenquanyi_160_75.qpf 16pt文泉驛粗體,不支持斜體 wenquanyi_160_50i.qpf 16pt文泉驛正常,支持斜體
size的大小是字體大小*10,也就是12pt字體的size是120,可是我對pt這個單位沒有什麼概念,因此我特地查找對比了一下字體大小的單位表示,整理以下:
小五號:9pt, 五號:10.5pt, 小四號:12pt 四號:13.75pt(磅), 三號:15.75pt(磅), 二號:21pt 中文最小字號:八號;2.83pt = 1mm, 28.3pt = 1cm = 一號字體(27.5pt) 字體大小對應的點陣: 9pt:12*12(96dpi),15*15(120dpi); 12pt: 15*15(96dpi),19*19(120dpi)不過在實際的嵌入式設備上顯示時好像和這種字體大小在word上的顯示不太一致,如前面的16pt文泉驛字體在設備上顯示的大小感受和word中的小四號字體差很少大。
步入重點,若是須要支持中文字體,顯然就須要有對應的中文字體文件。前面提到的unifont.bdf文件和文泉驛字體文件都是能夠支持中文的,也能夠從對應的網站上下載到官方的字體文件。而文泉驛字體在Linux系統X11平臺上也是使用的比較多的,因此能夠直接取用。
前面提到可使用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源碼中的文檔