11

我有一种字体,它在一个系列中具有多种字体粗细(超轻、轻、常规、半粗体、粗体、黑色)。在这个例子中,我使用了免费的 Google Webfont Source Sans Pro,但是对于任何具有多个权重的字体(例如 Avenir Next,Mac OS 10.8 中的系统字体),我都遇到了同样的问题。在 Qt 样式表中,如果我指定:

QLabel
{
    font-family: Source Sans Pro;
    font-size:   24px;
}

我得到了字体的“常规”样式。如果我指定:

QLabel
{
    font-family: Source Sans Pro;
    font-weight: bold;
    font-size:   24px;
}

我得到了字体的粗体版本。除了常规或粗体之外,我想不出任何组合可以给我任何东西。我尝试将权重直接放在字体系列中(例如,字体系列:Source Sans Pro Light;),我尝试在字体重量:说明符中使用 Light、Semibold 等,我还尝试使用数字等价物(Qt 文档说它们应该是从 0 到 99 的值,而不是 CSS x00 编号)。没有任何效果。

编辑:我只是尝试编写一个快速程序来为 font-weight 属性添加 0 到 999 之间的数字。有趣的是,如果我输入 0 到 399 之间的任何值,我就能得到“光”。400 到 407 给了我“常规”,408 到 599 又给了我光,然后 600 或更高给了我半粗体。这看起来很奇怪,因为现在使用数字我至少可以访问“light”和“semibold”。我仍然找不到任何方法来获得“Extra Light”或“Black”权重。

我唯一的问题是,如果不求助于自定义代码,这是不可能的吗?我可以通过创建一个 QFont 来获得我想要的确切字体,如下所示:

QFontDatabase db;
QFont = db.font("Source Sans Pro", "Semibold", 24 );

但显然这意味着我不能使用样式表(或者更糟的是,我必须编写自己的样式表解析器或包装现有的 Qt 或其他东西)。这似乎有点难以置信,这对于样式表是不可能的。Qt 对多粗细字体的支持很差吗?

4

1 回答 1

8

最后浏览了 Qt 源代码,我想我找到了答案。简而言之,不,这是不可能的。或者至少,它取决于字体,甚至可能取决于平台(我正在使用 Qt 4.8.4 在 Mac OS X 中工作)。

QFonts 有两种字体“权重”(由 QFont::setWeight() 设置),这是一个 0-99 之间的数字。它们还有一个由 QFont::setStyleName() 设置的“样式名称”。您可以在样式表中使用 font-weight 设置权重,但不能设置 styleName(我通过查看 qcssparser 的来源确认)。有一个font-style参数,但是只能用来设置normal、italic或者oblique……也就是说,它调用的是QFont::setStyle(),而不是setStyleName()。

至少在我的情况下,访问某些字体权重的唯一方法是通过“样式名称”,给它一个特定的字符串,如“Extra Light”。显然,Qt 正在做一些内部(可能是特定于平台的)魔术来在 0-99 权重数字和样式名称之间进行转换,但它似乎做得并不好。我在 Qt 源代码中陷入了困境,无法真正弄清楚这种映射发生在哪里。

更奇怪的是,QFont::setWeight 采用 0-99 之间的数字(如我之前所述),但样式表中的 font-weight 属性采用 100 到 800 之间的数字,然后将其除以 8 并调用 setWeight。我想这是为了更接近地匹配CSS 权重编号系统

现在我只需要弄清楚我要采取什么样的技巧来解决这个问题。我可以轻松地将诸如 font-style-name 之类的内容添加到 qcssparser,但我宁愿不修补 Qt 源代码,因此我可能会在应用程序级别做一些事情。

于 2013-02-16T00:13:30.150 回答