对于我们的应用程序,我们使用的是Avenir字体。
我们有两个版本:
我的系统(Mac OS X)不安装了这些字体,因为我希望我的开发机器具有与客户机相似的条件。
这两种字体都在我们的应用程序资源中。我们通过以下方式加载它们:
// 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");
两种字体都加载成功(至少,两者都得到好的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);
...如果我在系统上安装两种字体(OS X ),那么使用两种版本的字体就是,然后神奇地说,轻型和粗体版本都开始工作了。当然,这对我不起作用,因为我需要从我的应用程序资源中正确运行这些字体 - 我无法让用户为我的应用程序安装字体...
我在这里做错了吗? Qt是否失败,因为我正在加载具有相同“家庭”名称的两种字体?有没有办法我仍然可以从资源加载这些字体并成功使用它们而无需在目标机器上安装它们?
这是我在Mac上安装时字体的外观:
答案 0 :(得分:3)
我得到了它的工作。
我发现我认为是Qt 4.8.5 Bug,适用于OS X.我不确定这是否是由于OS X 10.9我使用 - Haven未在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);
但将成功:
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);
无需其他更改。
答案 1 :(得分:1)
这是一个Qt 4.8错误,以QTBUG-30917提交。在Mac上,您可以在应用程序包中发送字体并从那里加载而不是资源,除非您出于许可原因必须嵌入和隐藏它们。