Qt: почему DPI уменьшается при увеличении масштабирования из ОС - PullRequest
1 голос
/ 09 апреля 2019

У меня есть приложение Qt, и мне нужно адаптировать приложение (увеличение / уменьшение) при изменении масштабирования от ОС в Настройки отображения .

Я прочитализ Интернета:

Стандартные настройки DPI: 100% (96 DPI), 125% (120 DPI) и 150% (144 DPI)

Но,При входе в приложение Qt я получаю значения ниже DPI:

Масштаб - Физический DPI X - Физический DPI Y

100% - 158, 159

125% - 158, 159

150% - 79, 79

175% - 79, 79

Итак, согласно приведенным выше значениям, размер текста приложенияне имеет разницы для шкалы 100% и 125%.То же самое относится к 150% и 175%.

Ниже приведен код Qt, который я использовал:

    #include <QWidget>
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QWidget  widget;
    qInfo() << "Hello Qt";
    int dpiX = widget.physicalDpiX();
    int dpiY = widget.physicalDpiY();
    qInfo() << dpiX;
    qInfo() << dpiY;

Может кто-нибудь, пожалуйста, руководство?Я пытаюсь добиться того, чтобы приложение Qt работало (изменяет размер приложения / размер шрифта) в зависимости от масштабирования, установленного в Параметры отображения ОС .

1 Ответ

2 голосов
/ 09 апреля 2019

Я изначально предложил использовать QWindow::devicePixelRatio() в этом ответе.Однако, начиная с Qt 5.12, это на самом деле пока не работает правильно.Qt будет избегать дробных коэффициентов масштабирования из-за ошибки в реализации масштабирования пользовательского интерфейса Qt .Таким образом, для 125% он все равно будет возвращать коэффициент масштабирования 1,0.При 175% он вернется 2,0 вместо 1,75.

Так что сейчас вы должны вернуться к запросу DPI.Тем не менее, запросите логический DPI, , а не физический DPI, как вы делаете сейчас.Замените звонки на physicalDpi() функции звонками на logicalDpi().Это должно дать вам стандартный 96/120/144 DPI, сообщаемый Microsoft Windows.

Предыдущая часть ответа ниже может быть использована после того, как Qt исправит ошибку.


Предыдущий ответ, применимо, как только Qt исправит ошибку масштабирования

Запросите коэффициент масштабирования напрямую, не пытайтесь вывести его из DPI.Для этого вы используете QWindow::devicePixelRatio().При 100% масштабировании это вернет 1.0.При масштабировании 125% он вернется к 1,25.И так далее.Так как это коэффициент масштабирования, вы используете его как множитель для ваших размеров.

Вы должны вызвать devicePixelRatio() в окне, в котором находится ваш виджет. Это потому, что разные окна могут быть на разных дисплеях на несколькихнастройки монитора.

Окно, в котором находится виджет, может быть получено с помощью QWidget::windowHandle().Это может вернуть ноль, если виджет не является окном.Поэтому вам, вероятно, следует написать небольшую вспомогательную функцию, которая возвращает правильный DPR (Device Pixel Ratio) для виджета.Он должен принимать QWidget в качестве аргумента, и если windowHandle() возвращает нулевое значение для виджета, пройдитесь по родительскому дереву, вызывая windowHandle() для каждого родителя, пока не найдет первое, которое не возвращает нулевое значение.Затем верните windowHandle()->devicePixelRatio().Это будет правильный DPR для использования в этом виджете.

...