嵌入式Qt-4.8.6显示中文并且改变字体大小和应用自己制作的字体库

问题: 
QT4.8.6在移植到开发板上的时候,中文支持是必不可少的,如何让QT支持中文,如何制作QT支持的字体文件,如何使QT UI编辑器中的字号与开发板中的字号一致。 
详解: 
1>如何让QT支持中文 
  QT程序中指明的字体和字号在/opt/qt-4.8.6/lib/fonts目录下没有对应的字库文件时,QT会选择某一个存在的字库文件来显示;那么,如果你的系统中只有需要一种字体和字号,那么则可以将fonts目录下不需要的字库文件全部删掉,只保留这个需要的字体文件即可。 
上面是一种很方便的做法,无论程序中设置的字体和字号是怎样的,它始终都会按fonts目录下的这个唯一的字库文件格式来显示。但是,很多时候,我们需要多种字体和字号并存,那么下面将介绍如何添加wenquanyi 12 13 15 16 四种字号粗体和细体共8个字库文件,然后通过QFont来设置它们,访问对应的字库文件。 
首先,下载font_wenquanyi字体,字体有ttf、bdf、qpf等格式,我们这里下载的是qpf格式,如果是其它格式,则需要进行转换。我的资源可以提供下载。 
然后将下载的字库文件复制到开发板的/opt/qt-4.8.6/lib/fonts目录下,如下图 

以wenquanyi_120_75为例:wenquanyi是字体,120表示是15号字体,50表示细体,75表示粗体,在你的Qt程序main.c开头加上下面这个代码,然后编译运行,就可以看到原来的中文字符就会显示。

#include <QtGui/QApplication>
#include <QTextCodec>
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
this->setFont(QFont("wenquanyi", 12, QFont::Bold));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2>如何制作QT支持的字体文件 
下面将介绍如何制作QPF文件。 
QT有一个工具:makeqpf,是专门用来转换qpf文件的,但这个程序只能在嵌入式环境下运行,所以需要编译X86版的QT4.8.6。 
解压qt-everywhere-opensource-src-4.8.6.tar.gz,并将其复制两份,分别命名为:Qt-4.8.6-Pc, QtEmbedded-4.8.6(编译x86是为了得到makeqpf,编译pc是为了得到qvfb,arm版的之前编译了,这里就不用了) 

2.1 编译PC版 
cd /home/yangtq/qtcretor/Qt-4.8.6-Pc/qt-everywhere-opensource-src-4.8.6/ 
./configure -prefix /usr/local/Trolltech/Qt-4.8.6-Pc -opensource -confirm-license 
make 
make install 
然后进入源码 
cd /home/yangtq/qtcretor/Qt-4.8.6-Pc/qt-everywhere-opensource-src-4.8.6/tools/qvfb/ 
make 
就会qt-everywhere-opensource-src-4.8.6/bin/生成qvfb

2.2 编译X86版 
cd /home/yangtq/qtcretor/QtEmbedded-4.8.6/qt-everywhere-opensource-src-4.8.6/ 
./configure -prefix /usr/local/Trolltech/QtEmbedded-4.8.6 -opensource -confirm-license -embedded x86 -qt-gfx-qvfb(这个命令可以使应用程序在qvfb里运行,节省开发板) -qt-kbd-qvfb -qt-mouse-qvfb -make tools 
make 
make install 
安装目录在/usr/local/Trolltech/QtEmbedded-4.8.6/ 
将上一步中编译好的qvfb复制到/usr/local/Trolltech/QtEmbedded-4.8.6/bin中。 
cp /home/yangtq/qtcretor/Qt-4.8.6-Pc/qt-everywhere-opensource-src-4.8.6/bin/qvfb /usr/local/Trolltech/QtEmbedded-4.8.6/bin

2.3 安装完成后,在下面的目录里就可以找到它们 
cd /usr/local/Trolltech/QtEmbedded-4.8.6/bin 
准备要转换的字体文件,这里我们是下载的wqy-zenhei.ttf(我的资源也提供下载-wqy-zenhei.ttc)。 
将wqy-zenhei.ttc字体文件拷贝到/usr/local/Trolltech/QtEmbedded-4.8.6/lib/fonts中,这样是为了在makeqpf中找到它 
启动qvfb,并在qvfb里运行makeqpf软件 
cd /usr/local/Trolltech/QtEmbedded-4.8.6/bin 
./qvfb -width 1024 -height 800 & 
./makeqpf -qws 


 
注意事项 
1).选择要转换的字体,就是刚才复制到/usr/local/Trolltech/QtEmbedded-4.8.6/lib/fonts/wqy-zenhei.ttc 
2)输出路径:必须是你打开qvfb那个用户可以可读可写的目录权限 
3)最后点击下面的Generate Pre-Rendered Font就会生成你需要的字库 

  为什么是qpf2,这得说明一下,qpf是qt2和qt3用的,后来qt4改成了qpf2,而且我们可以看到,字号16的,直接就是12,不再是120了,下面就来看看使用吧,和上面的还是有一点点区别的。 
还是向上面一样设置,假设我要显示24号的字体: 
QFont font; 
font.setPointSize(160); 这里是设成24吗,设置后发现很小,只有当设成80的时候,才够24的大小,看了帮助文档后,发现原来 setPixelSize 才是设置字号的,改成 font.setPixelSize(24); 就可以了。(pointSize是一个相对值,和DPI相关;一般Windows上的DPI值是96,而embedded Linux的DPI值一般是72,所以字体会显得小了很多。所以应该用QFont::setPixelSize)。 
font.setFamily((“wenquanyi”));//这个Family怎么设,是文件名吗,不是,要在这里看 
 
font.setFamily((” WenQuanYi Zen Hei”));//注意空格

3>如何使QT UI编辑器中的字号与开发板中的字号一致。 
当我们UI的编辑器的设置的字号和大小与很多种,而我们要做的是,根据上面的方法生成你的界面里面所有需要的字库文件,然后复制到开发板的/opt/qt-4.8.6/lib/fonts/目录下,Qt程序会根据相应的字体库去找,而不需要在代码里面专门设置一个QFont,因为那样只能用到一个。下面这段就可以去掉

#include <QtGui/QApplication>
#include <QTextCodec>
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
this->setFont(QFont("wenquanyi", 12, QFont::Bold));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4>延伸QT直接支持TTF的字体文件。 
  QT直接支持TTF的字体文件,我们直接复制几个ttf文件,至/opt/qt-4.8.6/lib/fonts/目录下,将qpf的文件删除 
 
 重新在开发板上运行,发现几种字体和字号都能支持,看来系统中有多种字号,用ttf文件还是蛮方便的。 
有人说,ttf文件很大,比较费flash,QPF是点阵字库文件,占用flash较小,而且访问速度比ttf快。目前,通过目测暂时分辩不出快慢,但TTF文件只有10M左右,转换出来的qpf文件加起来一共有一百来兆。比ttf费flash多了,不知是否是设置的原因。

注: 
如果设置之后没有效果重启开发板(一定要重新启动,重新启动程序是看不出效果的,我就是在这儿被弄了很久),启动程序,现在开发板上应该有效果了吧,哈哈。由于资源太大不能上传资源,只能提供百度云盘下载了 
https://pan.baidu.com/s/1geZnNdp 
引用: 
http://www.cnblogs.com/liu_xf/archive/2011/07/05/2098144.html 
http://blog.csdn.net/walker_tok/article/details/7699677

https://blog.csdn.net/u014213012/article/details/53352645

原文地址:https://www.cnblogs.com/findumars/p/9094476.html

时间: 2024-10-07 20:45:54

嵌入式Qt-4.8.6显示中文并且改变字体大小和应用自己制作的字体库的相关文章

解析 Qt 字库移植并能显示中文 (下篇)

原文http://mobile.51cto.com/symbian-272563.htm 本文介绍的是Qt 字库移植并能显示中文,需要的字体库文件,一般是多个.具体移植那一个,看你使用的字库是什么了,先来看内容. AD: 解析 Qt 字库移植并能显示中文 (下篇)是本节介绍的内容,接着上篇 解析 Qt 字库移植并能显示中文 (上篇)继续介绍,烂来看本节内容. 1.几种格式字库的简介 QT支持四种格式的字库(TTF,BDF,PFA/PFB,QPF)(见参考文献[3]),但在产品中,如果直接使用,T

根据html容器大小和显示文字多少调节字体大小

在做html相关的东西的时候经常会遇到这样的问题,容器大小(长x宽)固定,容器包含内容(特指文字)多少不固定,这个时候就让人很苦恼了,将字体大小设置成多少才合适呢?下面看看我的解决思路: 首先要知道网页中所说的字体大小的px指的是字体的宽和高,也就是说在35px显示一个中文字符,该字符占去35x35的空间.知道这个之后,我们就可以想办法动态的根据容器大小和包含内容多少显示文字了. 首先要做的就是计算一个字符串的长短(一个中文字符记1个,一个英文字符记0.5个),我这里使用了简单的判断,当蚊子Un

Qt学习笔记-嵌入式qt程序支持显示中文

移植后得qt程序在开发板上运行时无法显示中文. 拷贝windows中的字体也不行. 从网上找到方法. 添加以下代码:需要头文件  #include <QTextCodec> QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); //支持Tr中文 QText

Qt学习之路【1】:QT显示中文问题

最近,公司项目的GUI界面使用的是Qt,研究了近两个月的Qt发现中文显示确实是一个问题,这个问题中主要存在两方面的问题: [1]中文显示: [2]中文乱码: 其中[1]问题出现的情景是:Qt的界面只有英文字母,中文一个都不显示,也不会出现乱码:[2]问题出现的情景是:Qt界面本来显示汉字的地方全部被乱码所代替. [1]问题产生的原因是:Qt字库中没有相应的字体,提供给Qt的界面 [2]问题产生的原因是:中文编码转换的问题. 字节顺序标记(BOM) 出现在字节流的开头,在windows下保存UTF

解决linux/Ubuntu下Qt creater 界面程序在编译运行后无法显示中文或中文乱码问题!

本文解决的主要是界面程序编译运行后无法显示中文的问题,如果在creater 中无法输入中文,下载个IBus或者搜狗之类的中文输入法即可解决! 首先说乱码问题,这个很好解决: 如果是在linux下打开Windows下的项目出现乱码,选择编码为"GB2312"即可! 现在主要来说说程序运行后无法显示中文或者出现乱码的情况,被这个问题困扰了很久,网上看了很多资料贴子都没有解决,所有该添加的都添加了都没办法, http://bbs.csdn.net/topics/390610841?page=

Qt使用MSVC编译器不能正确显示中文的解决方案

用VisualStudio做为IDE,使用Qt框架,显示中文,会出现乱码的情况. 原因:MSVC编译器虽然可以正常编译带BOM的UTF-8编译的源文件,但是生成的可执行文件的编码是Windows本地字符集,比如GB2312.在可执行文件中,字符串是以GB2312编码的,而可执行程序执行到该语句时,对这个字符串却是以UTF-8解码的,这样就会出现乱码. 解决方法有两种: 1.使用QStringLiteral()宏封装字符串,但此种方法不能使用tr()函数用于翻译字符串. QString str =

ARM+LINUX嵌入式系统的终端显示中文乱码解决

前一段时间解决的一个问题,看起来是个小问题,实际解决这个问题却花了一个星期的晚上休息时间,记录分享一下. 问题描述: linux内核配置中NLS(native language support)已经选择了默认语言配置为utf8,并包含一些其他常用语言的编码,但是在secureCRT的telnet和串口终端显示中文文件名均为乱码. 解决过程: 1.刚开始以为是简单的编码不匹配的问题,修改secureCRT中的传输编码方式从默认变为utf8,中文不再乱码,但变成了问号,"??????":

Qt 中一些常用类中文说明

Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进制的数据 QDataWidgetMapper 提供了从数据模型到部件的映射 QData 日期的功能 QDateEdit 提供了日期的部件用来编辑日期,是基于QDateTimeEdit 部件 QDateTime 提供日期与时间的功能 QDateTimeEdit 提供了编辑日期与实践的部件 QDBusA

Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(比较巧妙,toLatin1压缩掉了QString自动给每个英文字符加上的那些00字节)

今天研究了一下QFtp这个类,发现访问得到的文件名称中一旦出现中文,不管怎么转换编码格式,最终显示出来的始终都是乱码.于是我深入地对这一现象进行了研究.这里先简单介绍一下我的分析过程: FTP服务器在收到List指令后,会把当前文件夹的所有项目(包括文件夹和文件的名称,大小,时间,所有者等相关信息)列举出来并返回给FTP客户端.曾经在网上看到有人说过这样一句话:“ftp 在编码问题上相当笨,笨到对编码一无所知”.确实,多数FTP服务器在返回这些名称时采用的文字编码格式为ANSI.这是一个不太好的