【问题标题】:Automatic rescaling of an application on high-dpi Windows platform?在高 dpi Windows 平台上自动重新缩放应用程序?
【发布时间】:2014-08-13 13:51:58
【问题描述】:

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

不幸的是,Qt 框架还不支持高 dpi(至少在 Windows 上),所以我的应用程序及其所有元素看起来只有它应有的一半大小。

有什么方法可以强制/模拟 Windows 自动升级此类应用程序?

【问题讨论】:

    标签: windows qt hdpi rescale highdpi


    【解决方案1】:

    使用固定坐标和大小的应用程序在高 DPI 分辨率下看起来会很小。尽管即使使用布局,也存在一些关于元素和字体大小和边距的问题。幸运的是,从 Qt 5.4 开始支持高 DPI 显示,因为有很多 high-DPI issue fixes

    Windows 上的应用程序可以采用以下“DPI 感知”级别之一(来自 Qt 文档):

    • DPI 未知:此级别已在 Windows-Vista 中引入。 Windows 将假装应用程序运行在 标准显示 1920x1080 的 96 DPI 并缩放应用程序 因此。它旨在适应设计的旧应用程序 用于低 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
    

    您可以阅读更多信息here

    一般来说,要在高 DPI 显示器上获得良好的用户界面,请考虑以下几点:

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

    【讨论】:

      【解决方案2】:

      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();
      }
      

      或者设置系统环境变量:

      QT_AUTO_SCREEN_SCALE_FACTOR=1
      

      我已经在 Windows 10 上使用高 DPI Surfacebook 显示器测试了这两种方法,结果按预期正确缩放。

      【讨论】:

      • 没有改变任何东西。
      【解决方案3】:

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

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

      [Platforms]
      WindowsArguments = dpiawareness=0
      

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

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

      【讨论】:

        【解决方案4】:

        我正在使用 Qt 4.8。首先,您应该使用布局。我的目标是防止用户也调整对话框、表单等的大小。

        通过将这段代码放在对话框构造函数中,我在不同的 DPI 上获得了正确的显示结果:

        adjustSize();
        setFixedSize(size());
        

        第一行adjustSize() 调整对话框的大小以适应其内容。 第二行setFixedSize(size()) 在将对话框的大小调整为内容后修复了对话框的大小,并防止用户调整它的大小。您无需设置尺寸政策。

        【讨论】:

          【解决方案5】:

          我正在使用 Qt 4.8.7。这是我的代码。

          static float dpiX = (float)0;
          inline int autoDpiSize(int inSize)
          {
              if (dpiX == (float)0)
              {
                  HDC screen = GetDC(0);
                  dpiX = static_cast<float >(GetDeviceCaps(screen, LOGPIXELSX)) / 96.0;
                  ReleaseDC(0, screen);
              }
              return dpiX * inSize;
          }
          someWidget->setFixedHeight(autoDpiSize(30));
          

          【讨论】:

          • 感谢您的提示,但请问您为什么在 2020 年仍使用 4.8 ?它已经快十年了。
          • 因为我们有一个旧程序,它需要兼容 XP,甚至是 2000。
          猜你喜欢
          • 1970-01-01
          • 2020-05-18
          • 2018-11-30
          • 2021-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-15
          相关资源
          最近更新 更多