Qt同时使用多种字体

11

我有三种字体想在我的软件中使用:

  • FontA:包含拉丁、希腊和西里尔字符
  • FontB:包含韩文字符
  • FontC:包含日本和中文字符

这些字体没有重叠。

我想设置我的应用程序,以便同时使用所有这些字体,因为不同语言的字符可能出现在我的软件中的同一上下文中。

如果在FontA中找到一个字符,则使用它。否则,查看FontB,如果找到,请使用它。FontC是最后的备选项,如果找到,请使用它;否则就不做处理。

如何设置Qt以按此方式运行?

(我的环境是嵌入式Linux,Qt 4.8)

P.S.:我尝试了QFont :: insertSubstitution,但它只用于在系统上未安装FontA时使用,因此在我的情况下并没有真正帮助。
P.P.S.:将这些字体合并为单个字体是不可能的,因为它们是专有字体。


你能在运行时合并字体并将其传递到addApplicationFontFromData吗?这样你就不需要分发一个合并的字体(IANAL)。 - ratchet freak
你有查看过fontconfig手册吗?据我所知,当字体中的某个字形未找到时,你应该能够配置系统范围(或每个用户)的回退。 - peppe
我认为你没有理解重点。我不需要“字体回退”,我需要“字形回退”。Fontconfig支持字体回退,但字形回退必须在应用程序级别处理。 - erelender
@ratchetfreak 我认为这不是一个那么简单的方法。我需要解析每个字体文件并将它们合并成单个ttf格式的数据,然后将其传递给Qt,这在我看来是很多工作。 - erelender
此外,QtEmbedded 不支持 fontconfig。 - erelender
显示剩余2条评论
3个回答

1

就像其他人所说的 - 如果您的QT版本使用fontconfig,请通过fontconfig进行操作,它的唯一功能是管理智能字体替换。如果您的版本不使用fontconfig,则很遗憾,因为我怀疑任何人都没有投入太多时间来使其在现在广泛可用的fontconfig上运行。


我们的Qt版本不使用fontconfig,遗憾的是所有的建议都依赖它。只是为了明确,fontconfig可以基于字形来做到这一点吗?此外,有人能指向一个好的例子展示如何进行字形替换吗?我找不到 :( - erelender
Fontconfig比那要聪明得多,它拥有大多数常见语言所需的码点数据库,并且会自动替换适合特定语言环境的字体,以显示所请求的文本。而且你可以配置字体优先级、特定语言环境的覆盖等等。因此,它不仅会进行替换,还会尝试避免每两个字母就切换一次字体(像大多数简单的替换引擎那样)。它非常完整,但你需要阅读提供的示例规则集才能理解它的工作原理。 - nim
我明白了,问题在于我们当前的Qt配置没有使用fontconfig,并且要让它与fontconfig一起部署需要花费很多时间,所以我想确保在尝试之前能够完成这个任务。你能给我指一个可以做到你提到的事情的例子吗? - erelender

1
尝试使用这种方法:如何在Qt-Embedded中(正确地)输出多语言文本? 它可以同时支持许多语言(西里尔文、欧洲语言、泰语、日语等)。
  • 将Droid字体(不是必需的,也可以使用其他字体)放入Qt可以找到的目录中,
  • 导出特殊环境变量:export QWS_NO_SHARE_FONTS=1
  • 使用-fn"Droid Sans"参数运行您的应用程序

0

Qt有一个针对这种情况的后备机制。 在Qt4文档中,我发现您可以自定义此后备机制。看起来非常有前途,应该可以解决您的问题。

在Qt5中,我没有看到直接链接到QPlatformFontDatabase类的链接。只有这个。看起来您应该编写一些插件。 此外,此页面建议QPlatformFontDatabase出现在Qt 5.2中,因此它应该在Qt5中工作。由于某种原因,Qt5没有关于它的文档。

您应该尝试并查看或至少查看源代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接