Как получить четкий пользовательский интерфейс на высоких точках на дюйм с Qt 5.6?
Я разрабатываю на 4k монитора и его боль...
Наконец мне удалось настроить QtDesigner, а затем обнаружил эту проблему:
Когда вы используете QT_AUTO_SCREEN_SCALE_FACTOR=1
и скомпилировать приложение с radiobutton и другими основными виджетами, оно выглядит масштабированным на экране 4k. В противном случае размеры элементов управления являются правильными и, как и ожидалось, просто не резкими, а скорее пиксельными.
Я работаю на Windows 10 Home 64bit на 4k экране с 200% разрешением DPI, используя Qt 5.6 RC msvc2015 64bit и пытался добиться тех же результатов, используя
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
Если я использую
QGuiApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
элементы управления четкие, размер текста в порядке, но все размеры намного меньше.
Как сделать четкие элементы управления на экране с высоким DPI?
2 ответа
Как сказано в документации Qt:
Use QT_AUTO_SCREEN_SCALE_FACTOR to enable platform plugin controlled per-screen factors.
QT_SCREEN_SCALE_FACTORS to set per-screen factors.
QT_SCALE_FACTOR to set the application global scale factor.
Вы можете попробовать сделать то, что делает Qt Creator:
static const char ENV_VAR_QT_DEVICE_PIXEL_RATIO[] = "QT_DEVICE_PIXEL_RATIO";
if (!qEnvironmentVariableIsSet(ENV_VAR_QT_DEVICE_PIXEL_RATIO)
&& !qEnvironmentVariableIsSet("QT_AUTO_SCREEN_SCALE_FACTOR")
&& !qEnvironmentVariableIsSet("QT_SCALE_FACTOR")
&& !qEnvironmentVariableIsSet("QT_SCREEN_SCALE_FACTORS")) {
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
}
Принципиально важная вещь - последняя строчка QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
,
Вот что у меня работало. Вы можете установить DPIawareness вручную, указав параметр командной строки при создании экземпляра QApplication.
Официальная документация находится здесь https://doc.qt.io/qt-5/highdpi.html (раздел осведомленности о DPI).
Согласно документации, вы можете установить для приложения значение DPI Unaware (таким образом, оно будет автоматически масштабироваться, но отображение будет размытым), или System DPI Aware, или Per-Monitor Aware.
Вот минимальный пример кода для создания экземпляра QApplication для принудительного использования высокого разрешения, выберите значение, отличное от 1 (0 или 2), чтобы включить DPIUnaware или Per Monitor DPI Aware:
int main()
{
int argc = 3;
char*argv[] = {(char*)"Appname", (char*)"--platform", (char*)"windows:dpiawareness=1";
(void) new QApplication(argc, argv);
}
С QT_AUTO_SCREEN_SCALE_FACTOR размер шрифта шрифтов не изменяется, они просто масштабируются по сравнению с исходными пикселями, поэтому они никогда не будут сглаженными, только более неровными.
Ссылка: http://doc.qt.io/qt-5.6/highdpi.html"Это не изменит размер шрифтов точечного размера"
Вместо этого вам нужно использовать QT_SCALE_FACTOR, чтобы изменить масштаб вашего приложения, а не просто изменить его пиксели.