Qt | 窗口自适应高分辨率缩放总结

举报
黑兔子 发表于 2022/10/17 16:28:33 2022/10/17
【摘要】 前言windows下设置更改文本、应用等项目的大小为100%和125%时,Qt窗口显示正常,也能正常缩放。但是设置为150%和175%时,Qt窗口会出现大小自适应失效的问题。即使设置了支持高分辨率:QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);也没有什么效果。这个问题其实所有的程序都会有,不止Qt开发的程序会有这个问...

前言

windows下设置更改文本、应用等项目的大小为100%和125%时,Qt窗口显示正常,也能正常缩放。但是设置为150%和175%时,Qt窗口会出现大小自适应失效的问题。

即使设置了支持高分辨率:QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);也没有什么效果。

这个问题其实所有的程序都会有,不止Qt开发的程序会有这个问题。

Qt支持高分辨率缩放历程

  • Qt4时代的程序遇到高分屏缩放,不作任何处理。
  • Qt5.6开始提供了高分屏缩放支持,需要在main函数前面设置 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
  • Qt5.14开始提供了高分屏缩放策略设置,需要在main函数前面设置 QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);第二个参数用来控制缩放策略。
  • Qt6.0开始默认开启高分屏属性Qt::AA_EnableHighDpiScaling,而且不允许关闭(所以你会发现程序用Qt6编译后界面变得很大)。可以通过setHighDpiScaleFactorRoundingPolicy函数设置策略。
  • 如果不想要高分屏,希望程序永远保持默认的尺寸,你需要在main函数前面设置 QApplication::setAttribute(Qt::AA_Use96Dpi); 表示永远不缩放。

Qt启动高分屏的方法

1. 在QApplication a(argc, argv);之前设置Qt::AA_EnableHighDpiScaling和setHighDpiScaleFactorRoundingPolicy。

int main(int argc, char *argv[])
{
   QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
   QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); //第二个参数用来控制缩放策略。详细解释可以按F1看帮助文档。
   QApplication a(argc, argv);
}

这样用法的缺点是图片容易发虚,比如复选框的边框,哪怕是Qt内置样式风格或者系统默认风格也一样。还有就是不完全适配各种高分设置,效果不好,容易失效。

2.写个文本文件qt.conf(Qt程序默认的标准配置文件,必须是这个名字),写入配置内容,放到可执行文件同一目录即可,然后在pro文件中将此文件作为资源文件添加进来。此方法采用操作系统的策略进行缩放,推荐此方法,虽然看起来稍微有点模糊,但不会出现发虚等问题,整体一致。而且不容易失控。

文件内写入:

[Platforms]
WindowsArguments = dpiawareness=0

pro文件内写入:

RESOURCES += \
    qt.conf

即使是这种方法也不是完美的高分屏支持方法,只能是尽量满足适配问题。
哪怕是windows系统本身,在开启缩放的时候,任务管理器也是模糊的很(尽管改成124%可以改变,但总归不是好办法),还有很多其他知名软件也是如此。

还有需要注意的是,在使用配置文件设置时,确保在程序中不要再设置设置Qt::AA_EnableHighDpiScaling,否则会不生效。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。