Как вы получаете настройки шрифта системы по умолчанию в 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 в первую очередь, не так ли?
Ответы
Ответ 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"))