Как получить системные настройки шрифта по умолчанию в 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(), но это сводит на нет всю цель иметь собственный внешний вид без микроуправляемых шрифтов.
Итак, мой вопрос,
- как Qt определяет системный шрифт по умолчанию и,
- если это Qt Bug, как мне обойти это?
- Как я должен использовать.ui файлы и при этом во время выполнения мой интерфейс должен использовать системный шрифт по умолчанию?
Некоторые уточнения и факты, которые я нашел
Я хочу, чтобы мое приложение использовало системный шрифт по умолчанию для КАЖДОГО текста.
В этом обсуждении говорилось, что Designer будет добавлять информацию о шрифте независимо от того, хотите вы этого или нет. Поэтому Qt будет учитывать эту информацию, а не системный шрифт по умолчанию. По крайней мере, кто-то упомянул об удалении этой информации вручную, должен заставить Qt выбирать системный шрифт по умолчанию во время выполнения.
В моей машине разработки QApplication::font() возвращает неправильный шрифт по умолчанию. НО как получается, что QTableView, который я добавлю позже в коде, использует правый шрифт? Откуда он взял эту информацию?
Поэтому, если я найду, где QTableView найдет эту информацию, я могу получить ее в main и установить ее в приложении с помощью QApplication::setFont(). Затем остаётся ручное удаление всей информации о шрифте, тогда НАДЕЖДА это будет работать. Но это то, почему мы используем Qt, не так ли?
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"))