最近遇到一个问题:一个Qt程序在Windows上正常运行,在Linux下编译运行后汉字就全变成方块了,成了名副其实的“方块字”。

我一开始考虑是字符编码问题,调用QChar::unicode检查中文字符的编码,发现没有问题。

如果不是编码问题,那就需要考虑是字体问题了。然后就安装了文泉驿字体,然后将控件字体设置为文泉驿,发现还是没有用。

调用QFontDatabase::families检查所有可用字体,发现只有三四个可用的字体,而且都是英文字体。

那么问题来了,同样是Qt程序,为什么我使用的IDE——Qt Creator能够找到文泉驿字体,而我的程序不能?

实际上是因为库的问题,Qt Creator我使用的是二进制安装版,不需要编译,它依赖的是随主程序安装的Qt库。而我的程序依赖了我自己编译安装的Qt库。由于这两个版本的库编译选项不同,导致Qt程序自动查找到的可用字体不同。

那么,Qt在Linux下如何查找可用字体呢?

有两种情况:

  1. 操作系统安装了fontconfig库和freetype库,且Qt编译选项依赖了这两个库

这种情况下Qt使用了platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp文件中的void QFontconfigDatabase::populateFontDatabase()函数,依赖fontconfig库来查找字体文件,所以/usr/share/fonts下的字体都能找得到,Qt程序也就可以正常使用这些字体了。

  1. 操作系统没有安装fontconfig库和freetype库,或Qt编译选项没有依赖这两个库

这种情况下Qt会使用gui/text/qplatformfontdatabase.cpp文件中的void QPlatformFontDatabase::populateFontDatabase()函数来自行查找字体。如果你设置了QT_QPA_FONTDIR环境变量,那么Qt会在环境变量这个路径中查找可用字体;如果未设置环境变量,则会在Qt安装目录下的lib/fonts目录下查找可用字体。

所以如果Qt在Linux下出现了中文变方块的问题的话,且原因和本文中描述相同的话,有以下几种可行的解决方式:

  1. 安装fontconfigfreetype库,重新编译安装Qt。此种方法最为一劳永逸。
  2. 将你想用的字体文件复制到Qt安装目录下的lib/fonts目录。
  3. 设置QT_QPA_FONTDIR环境变量到你想用的字体文件目录。
  4. 手动读取加载字体文件。

Qt在Linux下如何查找可用字体相关推荐

  1. Linux下使用中文、字体、版

    月20日 Unicode BOM 发现网上某广为流传的中文帖子将Unicode字节流的标识字节(BOM, byte order mark)弄错了,正确的应该是: 00 00 FE FF UTF-32, ...

  2. Linux下ps查找进程用kill终止命令

    Linux下ps查找进程用kill终止命令<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:offic ...

  3. Linux下使用中文、字体

    目录 1. 一般性问题 1.1. 不是已经有很多汉字字库了吗?为什么还要再做一个? 1.2. 为什么我的机器上的汉字显示为一个方块或者问号? 1.3. 为什么我屏幕上的汉字边界模糊不清? 1.4. 为 ...

  4. Linux 下如何查找木马并处理

    Linux 下如何查找木马并处理 1.cat /etc/passwd 未发现陌生用户和可疑root权限用户. 2.netstat -anp 查看所有进程及pid号,未发现异常连接. 3.last 查看 ...

  5. linux 命令美丽,美丽的程序猿-Linux下那些查找文件的小技巧-find

    原标题:美丽的程序猿-Linux下那些查找文件的小技巧-find 一.按照文件名匹配查找 1. 查找当前目录下的文件tmp.sh find . –name tmp.sh 可以看出,使用.查找是查找当前 ...

  6. linux设备驱动,tty串口编程 如何查看linux下串口是否可用?串口名称等

    如何查看linux下串口是否可用?串口名称等? http://zhidao.baidu.com/question/419148559.html 查看串口是否可用,可以对串口发送数据比如对com1口,e ...

  7. linux vim 怎么查找,linux下vim 查找命令

    linux下vim 查找命令: /text --查找text, 按n查找下一个, N查找上一个 ?text --查找text(反向查找), 按n查找下一个, N查找上一个 */# --查找光标当前的单 ...

  8. Linux下的查找命令合集(which/whereis/locate/find)

    Linux 下的查找命令有很多,常用的有which.whereis.locate.find.那么这4个命令之间各自有什么特点,又有什么区别,什么时候该用哪个才最合适呢?方便我们在开发和学习中能更加有效 ...

  9. Linux下文件查找使用详解-羽飞作品

    Linux下文件查找使用详解 (1/3) http://www.boobooke.com/v/bbk1579 Linux下文件查找使用详解 (2/3) http://www.boobooke.com/ ...

最新文章

  1. PyTorch 系列教程之空间变换器网络
  2. Win8 x64 + Office Word 2013 x64 无法自动加载 Endnote X6 的解决方案
  3. BERT为什么是NLP的革新者
  4. 《c++ templates》学习笔记(9)——第十二章 特化与重载
  5. 双非高校浙工大,一年2项研究上Nature,校友纷纷打Call:欠一个211名头
  6. WinCE设置DataGrid行高
  7. python3标准数据类型
  8. 服务器打不QQ显示00001,QQ登录超时00001怎么处理?
  9. 三个对CS最大的谬误
  10. poj 3278 catch that cow BFS(基础水)
  11. 图结构练习——最小生成树
  12. java方法:flush()
  13. Android通过广播接收者调用服务内方法
  14. java使用jxl包读写excel表格文件,即xls格式文件
  15. android 平方常规字体,android - Android将Roboto字体设置为粗体,斜体,常规,…(类似于自定义字体系列) - 堆栈内存溢出...
  16. 计算机领域车牌识别,城市智慧停车的智能眼睛——车牌识别系统
  17. 【沐风课堂】MIRG for 3DMAX材质ID随机生成器使用教程
  18. 再回顾SGX初始化(一)——环境检查
  19. 《安富莱嵌入式周报》第295期:世界杯球员和足球实时跟踪,开源手持矢量网络分析仪,自制柔性电容式传感器,IAR加强对VSCode支持、索尼早期PSX的光驱模拟器
  20. 达梦数据库odbc的安装

热门文章

  1. DL4J中文文档/模型/顶点
  2. 磁珠(bead)和电感(inductance)的区别与联系
  3. 【转】Winform程序未捕获异常解决方法 EventType clr20r3 P1
  4. 编程语言1月排行榜:C是年度语言,Python增长量第二
  5. 中式台球 规则 ( ChinaBilliards )
  6. 多模态数据也能进行MAE?伯克利谷歌提出M3AE,在图像和文本数据上进行MAE!最优掩蔽率可达75%,显著高于BERT的15%...
  7. linux内核加载根文件系统,根文件系统 - Linux 内核引导选项简介
  8. 关于linux中构造无符号数字
  9. JAVA判断一个地理坐标是否在一个多边形区域内和是否在一个圆形区域内(经纬度)
  10. 《张成功项目管理记》一盯着,不停地盯着