Я изначально предложил использовать 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 для использования в этом виджете.