Qt: ресурсы шрифта работают для нормального веса, отказываются для Bold

Для нашего приложения мы используем шрифт Avenir.

У нас есть две версии этого:

  1. avenir_light.ttf - облегченная версия шрифта.
  2. avenir_black.ttf - жирная версия шрифта.

В моей системе (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");

Оба шрифта загружаются успешно (по крайней мере, оба получают хорошие идентификаторы, 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: введите описание изображения здесь

2 ответа

Решение

Я получил это на работу.

Я обнаружил ошибку Qt 4.8.5, применимую к OS X. Я не уверен, связано ли это с OS X 10.9, которую я использую - не тестировался на 10.8 или 10.7.

Я загружаю шрифты, как я указал ранее. The difference should be in the usage under OS X. Although the family of those two fonts is identical ("Avenir LT Com"), they need to be addressed differently so make the bold font work.

So, this fails:

QFont font("Avenir LT Com");
font.setPixelSize(22);
font.setWeight(QFont::Bold);  // tried QFont::Black too... 
font.setStyleStrategy(QFont::PreferAntialias);
ui->MyLabel->setFont(font);

But this will succeed:

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);

No other changes required.

Это ошибка Qt 4.8, поданная как QTBUG-30917. На Mac вы можете отправлять свои шрифты в комплекте приложений и загружать их оттуда вместо ресурсов, если только вам не нужно встраивать и скрывать их по причинам лицензирования.

Другие вопросы по тегам