我有一个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代码:
--exclude file1[,fileN] (--exclude can be replaced with -e as well)
有人可以指导吗?我想要实现的是Qt应用程序的行为(更改应用程序大小/字体大小)取决于在 OS 的 Display Settings 中设置的缩放比例。
答案 0 :(得分:2)
我最初建议在此答案中使用QWindow::devicePixelRatio()
。但是,从Qt 5.12开始,这实际上还不能正常工作。 Qt将避免由于bug in Qt's UI scaling implementation而导致的分数缩放比例。因此对于125%,它仍将返回1.0缩放因子。达到175%时,它将返回2.0,而不是1.75。
因此,现在,您应该回到查询DPI。但是,请像现在一样查询逻辑 DPI,而不是物理DPI。将对physicalDpi()
个函数的调用替换为对logicalDpi()
个函数的调用。这应该为您提供Microsoft Windows报告的标准96/120/144 DPI。
一旦Qt修复了错误,下面的答案的上一部分就可以使用。
直接查询缩放比例,不要尝试从DPI推断出来。为此,请使用QWindow::devicePixelRatio()
。在100%缩放时,将返回1.0。在缩放比例为125%时,它将返回1.25。等等。由于这是比例因子,因此您可以将其用作尺寸的乘数。
您应该在小部件当前所在的窗口中调用devicePixelRatio()
。这是因为不同的窗口可以在多显示器设置的不同显示器上显示。
可以使用QWidget::windowHandle()
获取窗口小部件所在的窗口。如果小部件不是窗口,则可以返回null。因此,您可能应该编写一个小的辅助函数,为小部件返回正确的DPR(设备像素比率)。它应该以QWidget作为参数,并且如果windowHandle()
为该窗口小部件返回null,则沿父级树前进,在每个父级上调用windowHandle()
,直到找到第一个不返回null的父级。然后返回windowHandle()->devicePixelRatio()
。这将是在该小部件中使用的正确DPR。