在高dpi Windows平台上自动重新调整应用程序?

Rob*_*bel 20 windows qt highdpi rescale hdpi

我正在编写一个需要在高dpi Windows(192dpi而不是96dpi)上运行的Qt应用程序.

不幸的是Qt框架还没有支持high-dpi(至少在Windows上),所以我的应用程序及其所有元素看起来应该是它应该的一半.

有没有办法强制/模拟Windows自动升级此类应用程序?

Nej*_*jat 10

使用固定坐标和大小的应用程序在高DPI分辨率下看起来很小.虽然即使使用布局,但在元素和字体大小和边距方面存在一些问题.幸运的是,从Qt 5.4开始就支持高DPI显示,因为有很多高DPI问题修复.

Windows上的应用程序可以采用以下级别的"DPI Awareness"(来自Qt文档):

  • DPI Unaware:此级别已在Windows-Vista中引入.Windows将假装应用程序在96 DPI 1920x1080的标准显示器上运行并相应地扩展应用程序.它旨在适应为低DPI显示器设计的旧应用程序.这种缩放可能会导致一些伪影.
  • System-DPI Aware:此级别已在Windows-Vista中引入.它仅在连接多个监视器时与Per-Monitor DPI Aware不同.Windows将计算适合所有连接的监视器的缩放比例.
  • Per-Monitor DPI Aware:此级别已在Windows 8.1中引入.Windows根本不执行任何扩展.

它还声明:

默认情况下,Qt应用程序是Windows 8.1上的Per-Monitor DPI Aware或旧版Windows上的System-DPI Aware.从Qt 5.4开始,可以通过将参数传递给平台插件来指定级别(请参阅使用qt.conf):

<application> -platform windows:dpiawareness=0,1,2
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读更多信息.

通常,要在高DPI显示器上拥有良好的UI,请考虑以下事项:

  • 使用最新版本的Qt
  • 使用布局并避免固定大小(除非您自己计算缩放比例)
  • 根据您的应用需求进行适当的DPI相关设置,例如,Qt::AA_UseHighDpiPixmaps如果使用set 属性QPainter和pixmaps,则设置属性,或计算在特殊情况下调整某些元素大小的缩放比例.


Nic*_*aus 8

Qt完全支持Qt 5.6以后的高DPI监视器,通过属性或环境变量(OS X除外,支持本机).对于属性方法,请使用:

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // DPI support

    QApplication app(argc, argv);   
    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

或者设置系统环境变量:

QT_AUTO_SCREEN_SCALE_FACTOR=1
Run Code Online (Sandbox Code Playgroud)

我已经使用高DPI表面监视器在Windows 10上测试了这两种方法,并且结果按预期正确缩放.

  • 没有改变任何东西。 (3认同)

Dav*_*Gin 7

这是在 Windows 上解决问题的最快方法。

在可执行文件旁边,创建一个 qt.conf 文件(如果还没有)并添加以下内容:

[Platforms]
WindowsArguments = dpiawareness=0
Run Code Online (Sandbox Code Playgroud)

放大时窗口会显得模糊。这个解决方案的一大优势是 Windows 进行缩放,而不是 Qt。因此,伪影的出现被最小化。此外,这可以适用于已经分发的应用程序,因为它不需要重建。

当然,这不是最令人愉快的结果,而是让你在短期内最快摆脱困境,让你毫无压力地开发出“真正的”DPI 感知版本的方法。