手动制作qt字库解决字体大小问题

来源: http://blog.youkuaiyun.com/newyoung518/article/details/8671095

 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 tools
make 
make install
  
cd qt-4.7.0-pc
./configure -prefix /usr/local/Trolltech/qt-4.7.0-pc -opensource -confirm-license
make
make install
  
#接下来安装PC版本的qvfp
cd qt-4.7.0-pc
cd tools/qvfp
make
cp 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多了,不知是否是设置的原因。

参考资料:



### 适用于QT开发的最佳字体推荐 在进行QT开发时,选择合适的字体对于界面设计和用户体验至关重要。以下是几种适合QT开发的字体推荐,结合了其特性和实际应用场景: 1. **DejaVu Sans Mono** DejaVu Sans Mono 是一款优秀的开源字体,基于 Bitstream Vera 字体改进而来[^5]。它能够清晰地区分字符如 `0` 和 `O`、`1` 和 `l` 等,这对于代码编辑和界面显示尤为重要。此外,这款字体支持多种语言字符集,包括中文字符,非常适合需要多语言支持的 QT 应用程序。 2. **Monaco** Monaco 是另一款经典的编程字体,广泛应用于 macOS 平台。虽然它的原生支持主要面向 macOS,但也可以通过手动安装的方式在 Linux 或 Windows 系统中使用。Monaco 字体具有良好的可读性,特别适合长时间编码或阅读文本的工作环境。 3. **Consolas** Consolas 是微软推出的一款高质量等宽字体,专为程序员设计。它对特殊字符(如括号、引号)进行了优化处理,提升了代码的可读性。尽管它是闭源字体,但可以通过合法渠道获取并集成到 QT 开发环境中。 4. **Source Code Pro** Source Code Pro 是 Adobe 提供的一款开源字体,旨在提供优雅且易读的代码书写体验。它支持多种语言字符集,并且与 QT 的跨平台特性完美契合。将其作为默认字体可以显著提升应用程序的美观度和一致性[^1]。 5. **Noto Sans/Noto Serif** Noto 系列字体由 Google 开发,覆盖了几乎所有的 Unicode 字符集,是实现全球化应用的理想选择。无论是拉丁字母还是亚洲语言字符,Noto 都能提供统一和谐的视觉效果。在嵌入式系统中使用时,需确保目标设备上已正确配置相关字库文件[^2]。 6. **Liberation Mono** Liberation Mono 是 Red Hat 推出的一套开源字体,专为替代商业字体而设计。它具备较高的兼容性,能够在不同操作系统间保持一致的显示效果。对于注重成本控制的企业级项目而言,这是一个经济实惠的选择[^3]。 7. **Droid Sans Mono** Droid Sans Mono 原本是 Android 平台上的默认字体之一,后来被广泛应用于其他领域。它的设计风格简洁明快,特别适合用于技术文档或用户界面中的文本展示[^4]。 ```python # 示例:设置 QT 应用程序的全局字体 from PyQt5.QtWidgets import QApplication from PyQt5.QtGui import QFont app = QApplication([]) font = QFont("DejaVu Sans Mono", 12) # 设置字体为 DejaVu Sans Mono,大小为 12 app.setFont(font) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值