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

以wenquanyi_150_50为例:wenquanyi是字体,150表示是15号字体,50表示细体,75表示粗体。
qt中程序如下:
#include <QtGui/QApplication>#include <QTextCodec>#include "hmi_desktop.h"int main(int argc, char *argv[]){ QApplication a(argc, argv); //中文支持 QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); //支持Tr中文 QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); //支持中文文件名显示 QFont font; font.setPointSize(160); //实际上是16的字号,但设成16却不行 font.setFamily(("wenquanyi")); font.setBold(false); a.setFont(font); //-- Hmi_desktop w; w.show(); return a.exec();} |
在开发板上运行,怎么样,字体是不是变了。高兴吧,得意吧!
好了,别得意忘了形,其实这仅仅只是一个开始。试想,如果你要显示32或者是48字号的字体,又或者你要显示其它字体,而网上又下载不到,怎么办?
2、来点真枪实料的
下面将介绍如何制作QPF文件。
QT有一个工具:makeqpf,是专门用来转换qpf文件的,但这个程序只能在嵌入式环境下运行,所以需要编译X86版的QT4.7。
解压qt-everywhere-opensource-src-4.7.0.tar.gz,并将其复制两份,分别命名为:qt-4.7.0-x86,qt-4.7.0-pc(编译x86是为了得到makeqpf,编译pc是为了得到qvfb,arm版的之前编译了,这里就不用了)
cd qt-4.7.0-x86./configure -prefix /usr/local/Trolltech/qt-4.7.0-x86 -opensource -confirm-license -embedded x86 -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb -make toolsmake make installcd qt-4.7.0-pc./configure -prefix /usr/local/Trolltech/qt-4.7.0-pc -opensource -confirm-licensemakemake install#接下来安装PC版本的qvfpcd qt-4.7.0-pccd tools/qvfpmakecp qt-4.7.0-pc/bin/qvfp /usr/local/Trolltech/qt-4.7.0-x86/bin |
安装完成后,在下面的目录里就可以找到它们
cd /usr/local/Trolltech/qt-4.7.0-x86/bin/ |
准备要转换的字体文件,可在C:\WINDOWS\Fonts 下找,或者去下载。
这里我们是下载的wqy-zenhei.ttf。
将wqy-zenhei.ttf字体文件拷贝到/usr/local/Trolltech/qt-4.7.0-x86/lib/fonts中,这样是为了在makeqpf中找到它
启动qvfb,并在qvfb里运行makeqpf软件
./qvfb -width 800 -height 480 &./makeqpf -qws |

分别输出16、24、32等字号,这样在输出路径指定的目录里就能看到这些文件了(注意:如果是选择根目录,则看不到文件,要在终端里才能看到)

为什么是qpf2,细致的朋友可能看出来了,这得说明一下,qpf是qt2和qt3用的,后来qt4改成了qpf2,而且我们可以看到,字号16的,直接就是16,不再是160了,下面就来看看使用吧,和上面的还是有一点点区别的。
还是向上面一样设置,假设我要显示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、解决setPointSize字太小的问题
在UI编辑器里,并没有setPixelSize的设置,只有setPointSize。如果要在开发板上显示正常的字号,必须要将PointSize设得很大,那么在计算机上的字就变得超大,无法通过ui编辑器达到所见即所得的效果。前面我们说过,这是因为显示器DPI不同的原因。在QT应用中,可通过环境变量来设置DPI,如下:
export QWS_DISPLAY="LinuxFB:mmWidth95:0"
export QWS_SIZE="640x480"
重新启动QT应用程序时,发现字号和计算机上的字号相差不那么大了,95的值并不是很准确,需要跟据显示器来调整,输入合适的DPI值,(我用群创AT056TN53的屏,DPI值设置为180比较合适)
4、进一步的尝试
QT直接支持TTF的字体文件,我们直接复制几个ttf文件,至/usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib/fonts目录下,将qpf的文件删除

重新在开发板上运行,发现几种字体和字号都能支持,看来系统中有多种字号,用ttf文件还是蛮方便的。
结语:
有人说,ttf文件很大,比较费flash,QPF是点阵字库文件,占用flash较小,而且访问速度比ttf快。目前,通过目测暂时分辩不出快慢,但TTF文件只有10M左右,转换出来的qpf文件加起来一共有一百来兆。比ttf费flash多了,不知是否是设置的原因。
参考资料:
如何构建Qt4.7.0嵌入式开发环境 http://blog.163.com/allegro_tyc/blog/static/33743768201101311239471/
QT中QPF字库的制作与旋转字体的实现 http://www.360doc.com/content/10/0308/00/79031_17944837.shtml
Qt 字体大小的计算 http://losemyheaven.blog.163.com/blog/static/17071980920111283934557/
QT字体的设置的更多相关文章
- eclipse护眼颜色和字体大小设置
♣eclipse护眼颜色和关键字颜色设置 ♣eclipse字体大小设置(包括jsp , .xml ,.java) 1.Eclipse字体大小调整: 窗口(Window)-首选项(Preferences ...
- 【POI xlsx】使用POI对xlsx的单元格样式进行设置 / 使用POI对xlsx的字体进行设置
涉及到的样式都在代码中有说明: package com.it.poiTest; import java.io.FileNotFoundException; import java.io.FileOut ...
- 超链接字体颜色设置(通过html/css的设置方法)
超链接字体颜色设置是通过css来设置,a链接的颜色设置常用的有以下两种,1.超链接a的初始状态颜色,2.超链接字体的鼠标滑过颜色,还有两种病不常用:3.超链接字体的已访问颜色,4.超链接字体在按下鼠标 ...
- QT:给Widget设置背景图片——设置Widget的调色板,调色板使用图片和背景色
QT:给Widget设置背景图片 1 /*2 * set background image3 */4 QPixmap bgImages(":/images/bg.png");5 Q ...
- 09LaTeX学习系列之---Latex 字体的设置
目录 目录: (一) 字体族的设置 1.说明: 2.源代码: 3.输出结果: (二) 字体系列的设置 1.源代码: 2.输出效果: (三) 字体形状的设置 1.源代码: 2.输出效果: (四) 字体大 ...
- html5移动端页面分辨率设置及相应字体大小设置的靠谱使用方式
对于html5移动端网页编写CSS网上有很多介绍的文章,但在实际使用过程中还是会纠结. 网上的资料太多,且大多都是技术介绍型,特别是针对android上,网上写的各种麻烦,各种复杂,各种不接地气儿.. ...
- [转载]Linux下终端字体颜色设置方法
原文地址:Linux下终端字体颜色设置方法作者:router 网上类似的文章有很多,但是都是转来转去的,没有经过测试,按照很多文章的方法会造成你设置之后的终端在换行和删除输入字符时终端显示会乱七八糟, ...
- HTML字体的设置
CSS字体设置 box-sizing:border #content-box box-shadow:设置盒子边框的阴影. 字体动作: font-family:设置字体.比如:‘微软雅黑 ...
- django-xhtml2pdf的使用(加入图片,指定字体,设置样式)
新博客地址:http://muker.net/django-xhtml2pdf.html 这里仅仅讨论直接利用html生成pdf这种最常见也最简单的情况. 1.要利用html生成带中文的pdf要指定中 ...
随机推荐
- device tree website
每一个设备都有相对应的初始化程序,dts的写法可以参照Documentations/devicetree/下面的文档 http://bbs.chinaunix.net/thread-4139331-1 ...
- Compiled Language vs Scripting Language
Referrence: Blog Compiled Languages Example: C, C++, Java Source code needs to be compiled into bits ...
- 相似文档查找算法之 simHash 简介及其 java 实现 - leejun_2005的个人页面 - 开源中国社区
相似文档查找算法之 simHash 简介及其 java 实现 - leejun_2005的个人页面 - 开源中国社区 相似文档查找算法之 simHash 简介及其 java 实现
- Oracle判断语句集合(转载)
SELECT decode(sign(to_date('2008-05-01', 'yyyy-MM-dd') - to_date('2008-03-01', 'yy ...
- poj 1759 Garland (二分搜索之其他)
Description The New Year garland consists of N lamps attached to a common wire that hangs down on th ...
- 创建一个jQuery UI的垂直进度条效果
日期:2013-9-24 来源:GBin1.com 在线演示 缺省的jQuery UI只有水平的进度条效果,没有垂直的进度条效果,仅仅重新定义JQuery UI的CSS不能解决这个问题. 这里我们扩 ...
- C++入门学习——标准模板库之vector
vector(向量容器),是 C++ 中十分实用一个容器.vector 之所以被觉得是一个容器,是由于它可以像容器一样存放各种类型的对象,简单地说,vector 是一个可以存放随意类型(类型可以是in ...
- Centos 7 python升级(2.7.5-》2.7.11)
1.安装升级GCC yum install gcc* openssl openssl-devel ncurses-devel.x86_64 bzip2-devel sqlite-devel pyth ...
- jquery返回顶部
// 返回顶部 var fixed_totop = $('.back_top').on('click',function(){ $('html, body').animate({scrollTop: ...
- ios开发 AFNetworking的基本使用方法
AFNetworking的基本使用方法 什么是GET请求? 如果只是单纯的下载数据, 使用GET请求 什么是POST请求? 特点: 请求的内容不会出现在URL网址中 向服务器发送用户名和密码, 或者 ...