Qt 程序 DPI 适配方法归纳
方案1:通过 Windows api 处理
缺点:放大之后界面会模糊。
- 通过调用api实现
#include <ShellScalingAPI.h>
#pragma comment(lib, "Shcore.lib")
HRESULT hr = SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE);
- 或者使用qt.conf 实现
在资源qrc里添加,:/qt/etc/qt.conf
, qt.conf 文件内容为:
[Platforms]
WindowsArguments = dpiawareness=1
dpiawareness
的取值0,1,2
取自枚举:PROCESS_DPI_AWARENESS
typedef enum PROCESS_DPI_AWARENESS {
PROCESS_DPI_UNAWARE = 0,
PROCESS_SYSTEM_DPI_AWARE = 1,
PROCESS_PER_MONITOR_DPI_AWARE = 2
} ;
PROCESS_DPI_UNAWARE
值: 0
DPI 不知道。 此应用不会缩放 DPI 更改,并且始终假定其比例系数为 100% (96 DPI) 。 系统将在任何其他 DPI 设置上自动缩放它。
PROCESS_SYSTEM_DPI_AWARE
值:1
系统 DPI 感知。 此应用不会缩放 DPI 更改。 它将查询 DPI 一次,并在应用的生存期内使用该值。 如果 DPI 发生更改,应用将不会调整为新的 DPI 值。 当 DPI 与系统值发生更改时,系统会自动纵向扩展或缩减它。
PROCESS_PER_MONITOR_DPI_AWARE
值: 2
按监视器 DPI 感知。 此应用在创建 DPI 时检查 DPI,并在 DPI 发生更改时调整比例系数。 系统不会自动缩放这些应用程序。
方案2:Qt处理(Qt 5.14 以上版本)
遗留问题:不同分辨率下gif图片会出现锯齿、模糊
- 在 main() 中添加如下代码:
// 1. 全局缩放使能
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
// 2. 适配非整数倍缩放
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
// 3. 适配字体渲染 hinting
QFont font;
font.setStyleStrategy(QFont::PreferAntialias);
font.setHintingPreference(QFont::PreferFullHinting);
QApplication::setFont(font);
- 确保所有的尺寸单位使用 px
qt字体的默认单位为 pt,而 pt 作为尺寸单位在自动缩放时存在问题。因此,需要手动设定所有字体大小,一种方法是在 Qt Designer 中编辑目标控件的 stylesheet 将字体尺寸用 px 重新设定。二种方法是在代码中设定字体大小(代码中设定尺寸默认单位均为 px)。
方案3:Qt6
升级到qt6之后基本解决了常见问题,不过qt6不支持win7
方案4:Qt低版本,计算DPI系数,逐个设置控件大小。
繁琐,但好用,没有qt给的解决方案的各种问题
double G_RATIO_X;
...
#define RATIO_X(x) (G_RATIO_X*(x))
...
//系统DPI
QDesktopWidget desk;
G_RATIO_X = desk.logicalDpiX()*1.0 / (DPI_DEFUALT*1.0);//DPI_DEFUALT 是96
//设置大小
resize(RATIO_X(800), RATIO_X(600));
...
pLabel->setFixedSize(RATIO_X(18), RATIO_X(18));
原文地址:https://blog.csdn.net/qiangzi4646/article/details/145156946
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!