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

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

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

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

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

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

Некоторые уточнения и факты, которые я нашел

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

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

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

Поэтому, если я найду, где QTableView найдет эту информацию, я могу получить ее в main и установить ее в приложении с помощью QApplication::setFont(). Затем остаётся ручное удаление всей информации о шрифте, тогда НАДЕЖДА это будет работать. Но это то, почему мы используем Qt, не так ли?

2 ответа

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

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

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

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

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

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

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

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