——【QT环境搭建】qt字库的移植(使其很好的显示中文)

1 如何定制字库(移植字库)
    需要将至少两个文件赋值到....lib/font目录下1. fontdir 文件。这个是应用程序寻找当前系统中最合适自己需要的字库的索引;2,需要的字体库文件,一般是多个。具体移植那一个,看你使用的字库是什么了,。比如我 现在的系统我就是移植的wenquanyi_12pt.bdf就可以了,当然这个比较大。你也可以用小点的。我的flash比较大呵呵,懒得折腾。在程序 中需要这样设置:
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8"));
设置使用utf-8编码也就是unicode编码了,这样在tr和string的都是unicode的编码了,根据字库的索引就能对应相应的字符了。
然后设置字体:
//字体设置
     QFont font("wenquanyi",12,QFont::Bold); //使用wenquanyi字体
     this->setFont(font);
//这样就设置了字体了,中文一般使用wenquanyi字体就可以了。很好的。
基础知识介绍:
字符编码
1、

符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体
中文的GB2312和用于繁体中文的big5。在这些编码中,中文和英文可以统一的处理,区分中文编码的方法是高字节的最高位为不为0。GB内码的存储方
式始终都是big endian,即高位在前。
2、
Unicode是一种字符编码方法,它是由国际组织设计,可以容纳全世界所有
语言文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character
Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。
Unicode与GB码不兼容,只与ASCII兼容。
UCS规定了怎么用多个字节表示各种文字。怎样传输这些编码,是由UTF(Unicode transforation format)规范规定的。常见的UTF规范包括UTF-8(就是以8位为单元对UCS进行编码)、UT F-7、UTF-16。
UTF-*和Unicode是同类,就是在编码方式上不同。首先UTF编码后的大小是不一定,不像Unicode编码后的大小是一样的。
字体库:
一般认为,一个汉字的编码就对应着这样的字形,这还是错误的。内码对于字库来说,只是查找字形的索引。如果换成另一个编码标准的字体,同一个字符串就会呈现不同的字形,也就是乱码。
随着GUI的发展,字库逐渐转向TTF.TTF字库的编码标准没有UTF8的
由于工作需要把ttf字体转换成qpf字体,牵扯到了qt的makeqpf工具的使用方法
先简单说一下qt的字体支持
Qte可以支持以下四种形态的字体格式
TrueType (TTF)、Postscript Type(PFA/PFB)、Bitmap Distribution Format fonts(BDF)、Qt Prerendered Font(QPF)
Qt中不同字体是用Unicode来处理、转换
因为Unicode(UTF16或者UTF8)最适合在任何人之间传递信息,
至于TrueType(不知道是什么东西,先唬着)的支援,目前Qte采用的是FreeType2 Livrary来显示字体,可充分享受无段式anti-aliased显示。

过下午的查证:Truetype是由AppleComputer公司和Microsoft公司联合提出的一种新型数学字形描述技术。他用数学函数描述字体
轮廓外形,含有字形构造、颜色填充、数字描述函数、流程条件控制、珊格处理控制、附加提示控制等指令。TrueType采用几何学中二次B样条曲线及直线
来描述字体的外形轮廓,其特点是:TrueType即可以作打印字体又可以做屏幕显示;由于它是由指令对字形进行描述,因此它与分辨率无关,输出时总是按
照打印机的分辨率输出。无论放大或缩小,字符总是光滑的,不会有锯齿出现。但相对PostScript字体来说,其质量要差一些,特别是在文字太小时,就
表现得不是很清楚
简单 一下:
truetype,字体就是可以不变形放大的字体,标准的字体大约有三种。*.fon 、*.ttf
、*.ttc,你所问的就是*.ttf
、*.ttc是*.ttf的新标准。*.fon就是很久以前用的字体,dos下现windows还有少量,主要用在系统使用方面可以提高程序的执行效率
FreeType是一个免费的并且可以被移植的TrueType 字库引擎,可以应用于很多平台! 
fontdir的简介下面是截取qtcore中默认的fontdir文件中的中文字库部分#Chinese character font from http://wqy.sourceforge.net/enwenquanyi wenquanyi_12pt.bdf BDF n 50 120 uwenquanyi wenquanyi_13pt.bdf BDF n 50 130 uwenquanyi wenquanyi_15pt.bdf BDF n 50 150 uwenquanyi wenquanyi_16pt.bdf BDF n 50 160 uwenquanyi wenquanyi_12ptb.bdf BDF n 75 120 uwenquanyi wenquanyi_13ptb.bdf BDF n 75 130 uwenquanyi wenquanyi_15ptb.bdf BDF n 75 150 uwenquanyi wenquanyi_16ptb.bdf BDF n 75 160 u可以看到共有七列
第一列:字体的名字,就是你在设置字体的时候的字体的名字
第二列: (file)即具体的文件名字
第三列: (renderer)字体的格式,有BDF,TTT,QPF等选择.
第四列: n 表示iitalic,是否为斜体
第五列:weight, 50 = Nomal,75=Bold
第六列: size 120表示12pt
第七列flags 有三个选项:s   (smooth)
                              u   (unicode顺序保存)
                              a   (ascii 顺序保存,默认是Latin 1)。
   
文件中每行都标识一个特定的字库,每个段的含义是:第一列为name,第二列为file,第三列为renderer,相当于字型格式,所以有
BDF,TTT,QPF等选择。第四列n表示iitalic,表示是否为斜体字。第五列表示weight,其中50表示Normal,75表示Bold。
第六列表示size,例如:120表示12pt。第七列为flags,有下面三个选择:s=smooth(anti-aliased)u
=unicode range when saving (default is Latin 1 a = ASCII range when
saving(default is Latin 1))
                                                         —— 摘自参考文献[1]
   
其中属性file,renderer(BDF,TTF,QPF)和size特别要设置对,其它属性问题不大。还要注意如果在该目录下有QPF的文件,系统
只会使用QPF格式的文件,而不会读取其它格式的文件,不管FONTDIR里面的内容是什么。如果有多个QPF文件,应用程序按照大小,家族,黑体和斜体
的顺序查找,即首先查找大小和自己一样的字库,大小无法区分唯一的字库的再看对应的家族,还是无法区分的再看是否黑体,是否斜体。可以参考PC上的字库索
引文件FONTDIR:
例如:
-cclib -song -medium -r -normal -jiantizi -16 -160 -75 -75 -c -160 -gb2312 1980 -0
其中,每个段的含义如下:
cclib:制造商
song:字体族,此处表示“宋体”字
medium:字权重(中等),还有bold(粗体)选项
r:倾斜,R(Roman),I(Italic),O(Oblique)
normal:字符集宽度,此外还有condensed,narrow,double
jiantizi:附加说明(此处意义为“简体字”)
16:用像素衡量的宽度。
160:点数 10
75(1):水平分辨率(dpi)
75(2):垂直分辨率(dpi)
c:间距。c:square,m:fixed width,p:variable width
160:平均宽度(10*pixels)
gb2312.1980:注册字符集,标准名
0:第0套,基本集
                                                      —— 摘自参考文献[2]
1.2 几种格式字库的简介
   
QT支持四种格式的字库(TTF,BDF,PFA/PFB,QPF)(见参考文献[3]),但在产品中,如果直接使用,TTF或PFA/PFB。即让应用
程序在显示的时候再计算点阵,最终的效果并不理想,会发现有些字大,有些字小,而且需要占用非常多的FLASH和内存,速度也有点慢,所以我在此不想过多
的介绍PFA/PFB。如果直接使用BDF,速度非常慢,而且需要占用比较多的FLASH和内存;使用QPF,速度和占用其它资源是最小的,因此我们最终
的产品中采用QPF格式。下面我简单介绍,TTF,BDF和QPF字体的结构,这样就比较容易理解后面的转换过程。
1.2.1  TTF字体
  
TTF(TrueType
Font)是Apple公司和Microsoft公司共同推出的字体文件格式,随着Windows的流行,已经变成最常用的一种字体文件表示方式。TTF
字体已经成功用在Windows中文版生成汉字字库,此字体采用二次B样条曲线来描述字符轮廓,对字符轮廓的上的点,按顺时针方向从小到大编号,填充部分
在其右边。TTF文件结构分成三个部分:文件名(12Bytes),描述表目录(每个16Bytes),描述表数据。
   
对于每一个字,都有一个假想的矩形框,正常情况字是不会超出这个矩形框的,中文属于象形字,不象英文,大小不一致,比如:英文中的f就可能会超出矩形框。
微软把矩形的高度称为EM,实际字符的高度称为BODY.矩形框最原始的坐标系是矩形的中心为原点,但为了实际字体在打印和显示的使用过程中的方便,通常
将坐标原点放在左下角,或中下。
   
通常,在实际打印过程中,TTF字体是用像素来度量的,如何将矩形框中的字体转成像素呢?有一个计算公式,实例如下:如果18个点的72点每英寸屏下有一
个550的长度,矩形框内有2048个单位。那其像素为550*18*72/72/2048=4.83像素。显然,每英寸里的点取的越多,字就越逼真,同
时这样的存储空间和计算的时间也就越多。在嵌入程序开发过程中,这往往是不可以接受的,因为嵌入式系统的硬件资源本来就很有限,如果真的这样的话,在显示
过程会很慢。并且如果为了提高速度而减少每英寸中的点数,则字体失真的情况很严重。更加具体的关于,TTF字体的内容可见参考资料[3]。
    另外,在Windows下编程,Microsoft实现了让用户对字体操作处理具有透明性,有关字体结构定义见参考文献[4]。
1.2.2 BDF字体
   
BDF(Bitmap Distribution
Format)是在X窗口系统中的一种表示位图字体的文件格式。是X协会定义的一种标准,是ASCII文件
它由两部分组成,一是表示字体整体属性的文件头信息;二是每一个字符独有的属性和位图数据。我以16*16的位图字体为例描述BDF字体文件格式。
STARTFONT2.1 /*后面跟一个版本号,指出该字体文件版本*/
COMMENT /*表示注释*/
FONT -adobe -courier -bold -r -normal -16 -160 -75 -75 -m -160 -gb2312.1980 -0 
/*表示字体名*/
SIZE 16 75 75 /*字符大小与在X,Y方向上的分辨率*/
FONTBOUNDINGBOX 16 16 0 0 /*X方向上宽度与Y方向高度及x和Y方向上的偏移*/
STARTPROPERTIES 16 /*设置字体的属性项目数*/
FOUNDRY "Adobe" /*字体的制造厂家*/
FAMILY_NAME "Courier" /*字体的变种字型*/
WEIGHT_NAME "Bold" /*字体的印刷权*/
SLANT "R" /*字体字型的设计情况*/
SEWINDTH_NAME "Normal" /*字体的缩放因素*/
ADD_STYLE_NAME "" /*唯一的标识该字体,一般为空*/
PIXEL_SIZE 16 /*依赖于设备的字体尺寸*/
POINT_SIZE 160 /*设计字体的实际尺寸*/
RESOLUTION_X 75 /*设计字体的水平分辨率*/
RESOLUTION_Y 75 /*设计字体的垂直分辨率*/
SPACING "m" /*指出字符宽度是定长还是可变*/
AVERAGE_WIDTH 160 /*字体中所有字符的平均宽度*/
CHARSET_REGISTRY "gb2312.1980" /*字符集名*/
CHARSET_ENCODING "0" /*字符集编号*/
FONT_DESCENT 0 /*基线下的高度*/
FONT_ASCENT 16 /*基线上的高度*/
ENDPROPERTIES /*属性项设置结束*/
CHAR 6775 /*字体文件中的字符数*/
STARTCHAR 啊 /*字符起始标志及名称*/
ENCODE 3021 /*X服务器在存取该字符时使用的编码。如汉字国标码*/
SWIDTH 1000 0 /*X和Y方向上的逻辑宽度和高度*/
DWIDTH 16 0 /*字符在x和Y方向上的设备单位宽度*/
BBX 16 16 0 0 /*字符边界框的宽度,高度以及偏移*/
BITMAP /*字符的位图的信息起始标志*/
0000 /*字符位图*/
04a0
……
0590
ENDCHAR /*字符结束标志*/
STARTCHAR 阿 /*第二个字符开始*/
……
ENDFONT /*BDF字体文件结束标志*/
1.2.3 QPF字体简介
   
QPF格式的字库是仅用于QT/Embedded的不可缩放的字体,在程序运行过程中,对TTF格式的字体,在第一次装入使用时,都要以给定的字体大小进
行处理;而对于BDF字体,当其使用时,所有字体都必须被处理;而对于QPF字体,均以相同格式的存储。所以在字体显示时,Qt只要读取字体,做相应分
析,然后显示就完成了,这样进一步减少了对RAM资源的浪费。QPF字体是基于UNICODE编码的,这为QT/Embedded良好的可移植性奠定了基
础。有关QPF更详细的资料可以查阅参考文献[5]。
2 如何从TTF字体文件转成QPF字体文件
2.1 把TTF转换成BDF
    尽管不推荐使用TTF格式的字库,但由于TTF格式的字库可以转换成任意大小的BDF字库,而可以找到的BDF字库都是固定大小的,因此在实际制作QPF字体文件时,还是需要TTF格式的字库。把TTF转换成BDF的方法如下:
./ttf2bdf source.ttf -p yourSize -o destination.bdf
   
即利用软件ttf2bdf可以把源文件source.ttf转换成大小为yourSize的BDF格式的文件destination.bdf。那在程序内
部是如何实现将TTF转成BDF的呢?由2.2.1和2.2.2的介绍,并且查阅参考文献[3],可以知道TTF的内部存储结构。其中最核心的部分是
TTF文件格式中的12个字节的文件表:表目录按tag以升序排列。
Type
Name
Description
ULONG
tag
4字节的标识
ULONG
checkSum
表中的CheckSum
ULONG
offset
TrueType font文件的起始偏移量Offset
ULONG
length
表长
    还有一个有关Offset表的信息,包括版本号,表的数量,查找范围。入口选择,转换范围。
    通过操作文件表,将描述表中的数据取出来,按照BDF字体所定义的格式写入,就可以生成对应的字体。比如,可以给出一小段c语言程序,此程序用于计算当前CheckSum的位置。
ULONG
CalcTableChecksum(ULONG *Table,ULONG Length)
{
ULONG Sum = 0L;
ULONG *Endptr=Table+((Length+3)& ~3)/sizeof(ULONG);
while(Table3 总结
   
经过本人对字库进行上述处理后,就可以在嵌入式开发板上显示各种字体,只要找到给定TTF或BDF的字库,如果找不到BDF字库,可以找到字库,然后通过
TTF2BDF这个程序来得到BDF字库。这样在开发板上可以显示行书,楷书等字体,并且字体显示也很正常,不会出现大小不一致的问题。但是,本人认为,
由于这是嵌入式开发,存储资源非常有限,如果能进一步将字库缩小,只留下程序中所要用的汉字组成的字库就好了,这是需要下一步研究的方向。
参考文献:
[1] 
http://jserv.Sayya.org/qtopia/doe/qte.txt
[2] 
http://www.Linuxfans.org/nuke/modules.php?name=Forums&file
= viewtopic&t=82950&highlight=fonts.dir
[3] Microsoft Corporation. TTF Technical Specification Revision 1.66 November 1995.
[4] Windows 2000编程核心技术精解[M].中国水利水电出版社,2001.
[5] 
http://doc.Trolltech.com/3.0/emb-fonts.html
[6] 黄敬群.Qt/Embedded中文处理实战[M]

qt QPF 字体各个字段的意义相关推荐

  1. qt 程序异常结束_【心电国际指南2009专家解读】浦介麟 冉玉琴老师:QT 间期的规范化测量及其意义...

    如何快速搜索微信公众号中的心电资料? 点我.点我 心电图标准化与解析的建议与临床应用国际指南2009 专家解读 QT 间期的规范化测量及其意义 浦介麟 冉玉琴 阜外心血管病医院 本标准化及建议由美国心 ...

  2. QT中文字体的显示方法

    QT中文字体的显示方法 一.QT显示中文失败的原因,如显示为方块或乱码 1)qte的库未编译进对中文textcodec的支持,解决方案:修改qconfig-qpe.h, 去掉CODEC有关的宏,重新c ...

  3. 数据库中CreateAt、UpdateAt字段的意义

    这里是修真院后端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析后端知识/技能,本篇分享的是: [ 数据库中Cr ...

  4. ffmpeg 中 -f <format> 字段的意义

    ffmpeg 中 -f <format> 字段的意义 ---------------------------------------- author: hjjdebug date: 202 ...

  5. PyQt5 图形界面 - Qt Designer设置简体中文方法演示,Qt Designer字体设置,Qt Designer工具单独安装包获取,Qt Designer简体中文语言包获取

    Qt Designer 工具获取: PyQt5 图形界面 - Qt Designer 独立安装包,仅需 30M!python 图像化界面绘制工具 这是默认版本样式,下面来看下简体中文设置过程. Qt ...

  6. QT 文字字体和颜色设置

    QT中的字体(比如QLabel中的字体)有时需要在程序中进行动态的设置.其中字体和颜色是分开设置的.设置字体主要使用的是QFont对象.设置颜色主要使用的是QPalette(调色板)来进行.所以要包含 ...

  7. Qt treeWidget 查找指定字段内容的条目并跳转到该条目

    遍历Qt treeWidget,查找指定字段内容的条目,并跳转到该条目. void MainWindow::on_pushButton_sidFind_clicked() {QString sid = ...

  8. qt html字体变红,QLineEdit、QLabel字体大小、颜色设置

    QT中的字体有时需要在程序中进行动态的设置.其中字体和颜色是分开设置的.设置字体主要使用的是QFont对象,设置颜色主要使用的是QPalette(调色板)来进行. 一.QLineEdit 定义对象: ...

  9. QT中文字体显示以及字体大小不能改变的问题

    想在QT程序中支持中文,最简单的方法:在main函数中调用 QTextCodec::setCodecForTr( QTextCodec::codecForName("GBK") ) ...

最新文章

  1. 微信官方jssdk Demo -php版
  2. 第十一章:配置和安全---IntelliMorph
  3. ML.NET 示例:图像分类模型训练-首选API(基于原生TensorFlow迁移学习)
  4. sakura计算机谱子,【14.08.13自拟】SAKURA急求生物股长的简谱
  5. A simple BBS demo including(CRUD) - 1
  6. Android Studio 如何添加悬浮提示
  7. win10专业版激活办法
  8. sqlserver2005 安装及SQL 2005 SP3补丁安装详解
  9. FlashFXP 4.2.4 破解版
  10. 【永恒之蓝】最新勒索软件WannaCrypt病毒感染前后应对措施
  11. thinkPHP框架
  12. Kibana 操作 Elasticsearch
  13. Kernel:CC_HAVE_ASM_GOTO 、 Compiler lacks asm-goto support
  14. 决策规划算法二:生成参考线(FEM_POS_DEVIATION_SMOOTHING)
  15. 用好HugePage,告别Linux性能故障
  16. 2021高考成绩特长生查询,2021高考体育生分数怎么算 体育四项评分标准及分值一览表...
  17. 1.2 储存卡牌信息———自制卡牌游戏之旅
  18. 二、Git本地仓库基本操作——创建Git仓库、提交更新或删除文件
  19. 【朝花夕拾】Android自定义View篇之(一)View绘制流程
  20. Angelababy 首攻好莱坞 获封最闪亮新星

热门文章

  1. 日积月累Day6(为什么家庭会生病)
  2. TVM学习(七)记录 在开发板上布置VTA (RPC 服务器的构建)
  3. 【辞九门回忆】等什么君
  4. idea减小启动项目时占用的内存
  5. Java线上故障解决方案
  6. 美国Xensor电化学传感器XEN-TCG3880Pt
  7. 输电线路巡检红外图像与可见光图像融合数据集(含分割标签,1700多张图像),可见光图像,红外灰度图像,一一对应可用于图像配准
  8. 网站建设如何做好页面布局合理
  9. yii2多张图片上传后端保存功能
  10. 职教云计算机网络基础题库,最新章节测试答案2020智慧职教云创业竞争力提升...