对于我们的应用程序,我们使用的是Avenir字体.
我们有两个版本:
我的系统(Mac OS X中)并没有安装这些字体,因为我想我的dev的机器有一个客户端机器类似的条件.
两种字体都在我们的应用程序资源中 我们通过以下方式加载它们
// returns 0
int id = this->fontDatabase.addApplicationFont(":/fonts/avenir_light.ttf");
// returns 1
int id_b = this->fontDatabase.addApplicationFont(":/fonts/avenir_black.ttf");
// returns "Avenir LT Com"
QString family = QFontDatabase::applicationFontFamilies(id).at(0);
// returns "Avenir Lt Com" -- same as other font)
QString family1 = QFontDatabase::applicationFontFamilies(id_b).at(0);
// This will contain two strings:
// "35 Light"
// "95 Black"
QStringList sl = this->fontDatabase.styles(family);
// this returns TRUE
bool isThereBold = this->fontDatabase.bold(family, "95 Black");
Run Code Online (Sandbox Code Playgroud)
两种字体都成功加载(至少,两者都得到好的ID,分别为0和1,而不是-1).当我查询他们的姓氏时,两种字体都返回"Avenir LT Com",我想知道这是否是一个问题,因为只有光字体在运行时可用. - 即使我指定了粗体,黑色和任何高数字的重量.
字体不同.黑色的确是"大胆".将它们安装到我的Mac中会在字体书"Avenir LT Com"中显示一个"系列",有两种变体:普通和黑色.所以我理解姓氏是相同的,即使它们是两个不同的TTF文件.
相同代码的唯一方法就像这样简单:
QFont font("Avenir LT Com");
font.setPixelSize(22);
font.setWeight(QFont::Light); // tried QFont::Black too...
font.setStyleStrategy(QFont::PreferAntialias);
ui->MyLabel->setFont(font);
Run Code Online (Sandbox Code Playgroud)
...使用两种版本的字体是因为我在系统上安装了两种字体(OS X),然后神奇地说,轻型和粗体版本都开始工作.当然,这对我不起作用,因为我需要从我的应用程序资源中正确运行这些字体 - 我无法让用户为我的应用程序安装字体...
我在这里做错了吗?Qt是否失败,因为我正在加载具有相同"家庭"名称的两种字体?有没有办法我仍然可以从资源加载这些字体并成功使用它们而无需在目标机器上安装它们?
这是我在Mac上安装时字体的外观:
我让它工作了。
我发现我认为是 Qt 4.8.5 Bug,适用于 OS X。我不确定这是否是由于我使用的 OS X 10.9 造成的——尚未在 10.8 或 10.7 上进行测试。
我加载字体就像我之前指出的那样。差异应该在于 OS X 下的用法。尽管这两种字体的系列相同(“Avenir LT Com”),但它们需要以不同的方式处理,因此请使用粗体字体。
所以,这失败了:
QFont font("Avenir LT Com");
font.setPixelSize(22);
font.setWeight(QFont::Bold); // tried QFont::Black too...
font.setStyleStrategy(QFont::PreferAntialias);
ui->MyLabel->setFont(font);
Run Code Online (Sandbox Code Playgroud)
但这会成功:
QFont font("Avenir LT Com 95 Black"); // I have to put the family name + style together!
font.setPixelSize(22);
font.setWeight(QFont::Bold); // ...And still set the weight!
font.setStyleStrategy(QFont::PreferAntialias);
ui->MyLabel->setFont(font);
Run Code Online (Sandbox Code Playgroud)
无需其他更改。