如何为跨平台的Qt应用程序指定等宽字体?

74

有没有一种跨平台的方式来为Qt小部件指定固定宽度字体?

如果我在Linux上在设计器中将字体设置为“Monospace”,则在Windows上找不到该字体,会改用Arial。

4个回答

59

您可以使用QFont的style hint属性:

QFont font("Monospace");
font.setStyleHint(QFont::TypeWriter);

如果找不到字体(这在Windows上使用等宽字体时会发生),Qt的字体匹配算法会尝试查找与给定样式提示相匹配的字体。

5
好奇问一下:为什么不使用QFont::Monospace - kralyk
7
一个有用的附加说明:该代码仅在将姓氏传递给QFont构造函数时才起作用。否则,它将使用默认字体系列,这将是可变宽度的,然后覆盖样式提示。当我没有特定的等宽字体来请求时,我不得不使用QFont font(""); - Harvey
@kralyk 我也很好奇,我在Windows上尝试了一下,发现QFont::Monospace不会产生等宽字体,而TypeWriter会。虽然我无法解释为什么 :( - AkiRoss
(注意,以下内容适用于PyQt,我无法测试C++,但应该以相同方式工作)为了获得与默认字体成比例的字体,最好使用应用程序字体,然后设置字体系列字符串:font = QFont() font.setFamily('monospace');在设置系列之前可能仍需要设置样式提示。 - musicamante

47

您可以使用QFontDatabase的systemFont(..)函数来检索系统的默认固定字体。它是在Qt 5.2中引入的。

示例:

const QFont fixedFont = QFontDatabase::systemFont(QFontDatabase::FixedFont)

1
实际上,在Linux上的Qt 5上这并没有起作用,但这可能是由于我们静态Qt构建中的某些fontconfig配置错误;然而,setStyleHint方法确实起作用了。 - Matteo Italia
@MatteoItalia 哪个Linux系统?在KDE Neon 16.04上对我也没用。 - Silicomancer
@Silicomancer:谁知道呢;肯定是某个KDE版本,可能是Kubuntu 16.04或14.04的其中一个。 - Matteo Italia

20

对于接受富文本的所有小部件,您可以将其简单地放入pre块中,即<pre>这是我的文本</pre>。然后它将使用系统等宽字体。


3
我在程序中尝试了这个方法并且它有效,但是它也会在 pre 标签后添加一个换行。我不知道如何去掉它,所以我尝试了使用 <font face="monospace">text</font> 替代,它可以工作!不过我还没有验证我的解决方案是否可移植。 - mjwach
或者 <code> 如果你想让文本换行。 - Jonas Eberle

7

我在Linux和Windows上都使用Qt中的Courier字体。


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