在Qt样式表中,是否可以指定除“正常”和“加粗”之外的字体版本?

11

我有一个字体,它在一个家族中包含几种字重(extra light,light,regular,semibold,bold,black)。为了说明此例,我将使用免费的Google Webfont Source Sans Pro,但对于任何具有多个字重的字体(例如Mac OS 10.8中的系统字体Avenir Next),我遇到了同样的问题。 在Qt样式表中,如果我指定:

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

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

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

我得到了字体的加粗版本。我无法想出任何组合,除了常规或加粗,其他任何东西都不会出现。我尝试直接将权重放入字体系列中(例如,font-family: Source Sans Pro Light;),我尝试在font-weight:指定器中使用Light、Semibold等等,我还尝试使用数字等效值(Qt documentation说它们应该是值从0到99,而不是CSS x00编号)。没有任何作用。
编辑:我刚刚尝试编写一个快速程序,在字体权重属性之间插入0到999之间的数字。有趣的是,如果我输入0到399之间的任何内容,我都能获得“轻”字体。400到407给了我“正常”,408到599又给了我轻字体,然后600或更高就给了我半粗体。这似乎非常奇怪,因为现在使用数字我至少可以访问“轻”和“半粗体”。我仍然找不到任何方法可以获得“Extra Light”或“Black”字重。
我的唯一问题是,如果不诉诸于自定义代码,是否不可能做到这一点?我可以通过创建如下的QFont来获得我想要的完全字体:
QFontDatabase db;
QFont = db.font("Source Sans Pro", "Semibold", 24 );

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


使用qt5.6.1,在样式表中设置斜体和粗体字体如下: font: 75 11pt "OPPOSans"; font: italic 11pt "OPPOSans"; - netawater
1个回答

8
最终浏览了Qt源代码,我想我找到了答案。简而言之,不行。或者至少,这取决于字体,甚至可能取决于平台(我使用的是Mac OS X和Qt 4.8.4)。QFont具有字体“权重”(由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 权重编号系统
现在我只需要想出要做什么样的黑客来解决这个问题。我可以很容易地向 qcssparser 添加类似于 font-style-name 的东西,但我不想修补 Qt 源代码,所以我可能会在应用级别上做些什么。

5
结果表明,这只是在Mac OS X上的问题。我应该提交一个Qt错误报告。如果您在Mac和Linux上(都使用Qt 4.8.4)运行完全相同的代码来选择完全相同的TrueType字体,则会得到不同的结果。Linux/X11版本会按预期执行。 - ScottG

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