Как вы получаете настройки шрифта системы по умолчанию в Qt? - программирование
Подтвердить что ты не робот

Как вы получаете настройки шрифта системы по умолчанию в Qt?

Я создаю настольное приложение с помощью Qt, моя машина-разработчик выигрывает 7 x64 с японской локали, стандартный системный шрифт Meiryo. Большинство пользовательских интерфейсов Win 7 находятся в этом шрифте, хотя классические/старые программы, такие как окно настройки шрифта ui, используют другой шрифт, который является MS UI Gothic. Это меня не беспокоит, пока я не обнаружил, что QtCreator строит мое приложение с MS UI Gothic в одном месте, а Meiryo - в другом. Например, qlabels, qlineedits, qcombobox использует MS UI Gothic, но пользовательский комплект с qtableview, который я добавляю позже, использует Meiryo.

Я сделал большую часть пользовательского интерфейса в QtCreator Designer, а дополнение к нему добавлено в код. Если я изменю шрифт всех виджетов на Meiryo в The Designer, то, конечно, приложение будет использовать Meiryo, поэтому посмотрите правильно, но в этом случае я предпочел бы, чтобы Qt автоматически выбирал любой шрифт по умолчанию для системы, потому что win 7 не будет единственным Я буду использовать эту программу.

Что еще больше беспокоило меня, так это то, что QApplication:: font() возвращает MS UI Gothic, что является ложным в моем случае. Конечно, я могу установить шрифт приложения по всему миру, используя QApplication:: setFont(), но это побеждает всю цель иметь собственный внешний вид без микроманипуляции.

Итак, мой вопрос:

  • как Qt определяет стандартный шрифт системы и
  • Если это ошибка Qt, как мне обойти это?
  • Как использовать файлы .ui и по-прежнему использовать мой пользовательский интерфейс по умолчанию для системного шрифта во время выполнения?

Некоторые разъяснения и факты, которые я нашел

  • Я хочу, чтобы мое приложение использовало стандартный шрифт системы для КАЖДОГО текста.

  • В этом обсуждении сказано, что Designer будет добавлять информацию о шрифте независимо от того, хотите вы этого или нет. Таким образом, Qt будет оценивать эту информацию, а не стандартный шрифт по умолчанию. По крайней мере, кто-то, кто упоминал об удалении этой информации вручную, должен был сделать шрифт по умолчанию для Qt во время выполнения.

  • В моей машине dev QApplication:: font() возвращает WRONG шрифт по умолчанию. НО, почему QTableView, который я добавляю позже, использует RIGHT шрифт? Откуда он получил эту информацию?

Итак, если я нахожу, где QTableView находит эту информацию, я могу ее получить в основном и широко использовать приложение QApplication:: setFont(). Затем то, что осталось, вручную удаляет всю информацию о шрифте, тогда ВЕРНУЮ это сработает. Но это похоже на то, почему мы используем Qt в первую очередь, не так ли?

4b9b3361

Ответ 1

Я могу представить два возможных решения:

  • Вы можете упаковать с вашим приложением шрифт в качестве файла ресурсов, таким образом, все платформы будут использовать этот шрифт независимо от текущего шрифта по умолчанию для системы.

  • Класс QFont имеет метод defaultFamily(). Используя это, вы можете вручную установить шрифт по умолчанию для всего QApplication.

Пример (основной метод):

QApplication application(argc, argv);
QFont font;
font.setFamily(font.defaultFamily());
application.setFont(font);
...rest of your code...

Ответ 2

Qt вызовет Windows API SystemParametersInfo, чтобы получить шрифты для QMenu, QMessageBox и т.д., и использовать GetStockObject для получения системного шрифта по умолчанию. Некоторые виджеты имеют специальный шрифт, который отличается от стандартного по умолчанию. Я думаю, что Qt делает все правильно, но шрифт японского/китайского шрифта по умолчанию выглядит плохо на мониторах HiDPI.

Просто используйте QFont QApplication::font ( const char * className ), чтобы получить правильный шрифт (Meryo в вашем случае), например qApp->setFont(QApplication::font("QMenu"))