嵌入式Qt方案中文显示系列:Qte中的字体支持和使用

前话:工做以来在项目中主要的开发工做都是用嵌入式QT开发界面,从一开始的从零摸索,到如今有点头绪和经验,不少东西和用法依然只是知其然,不知其因此然,甚至一些还仅仅是模仿阶段。在这期间,学的东西很零散,因此如今有一次作这块,打算弄明白一些东西,也算对本身付出的时间有个交待。 html

使用嵌入式Qt做为嵌入式GUI的解决方案,其实会比较轻松,除了几个很少的难点,就我目前的经验,一个是资源占用问题,对于资源紧张的系统优化会比较难,一个是中文显示的问题,这个也是我第一次花的时间不少的一块,网上这块的资料不少,说明问题比较广泛。如今回过头来看,实际上也不是那么难搞定。这里就中文显示写几遍学习理解的文章,即为本身,也方便后来者。 shell

支持的字体

嵌入式Qt支持4中格式的字体,分别是: less

  • 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特性宏: 工具

/*
   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

  • $QTDIR/lib/fonts/fontdir    QTDIR是通常使用Qte都会定义的环境变量
  • /usr/local/qt-embedded/lib/fonts/fontdir  多是默认的qte安装路径

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

上面也提到了,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

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平台上也是使用的比较多的,因此能够直接取用。

关于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源码中的文档

相关文章
相关标签/搜索