当前位置: 首页 > article >正文

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


http://www.kler.cn/a/509414.html

相关文章:

  • [Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget
  • DPIN与CESS Network达成全球战略合作,推动DePIN与AI领域创新突破
  • K8S开启/关闭审计日志
  • 【Go】Go数据类型详解—指针
  • Spring boot框架下的RocketMQ消息中间件
  • 每打开一个chrome页面都会【自动打开F12开发者模式】,原因是 使用HBuilderX会影响谷歌浏览器的浏览模式
  • PostgreSQL17(最新版)安装部署
  • 计算机网络 | IP地址、子网掩码、网络地址、主机地址计算方式详解
  • 详解C#反射(Reflection)
  • JAVA:解释器模式(Interpreter Pattern)的技术指南
  • PCM5142集成32位384kHz PCM音频立体声114dB差分输出DAC编解码芯片
  • 第三节 从善如流
  • 2025年供应链攻击或成企业主要威胁
  • Leiden算法一种用于社区检测的图聚类算法
  • Swift 趣味开发:查找拼音首字母全部相同的 4 字成语(下)
  • 题解 CodeForces 430B Balls Game 栈 C/C++
  • MySQL HASH索引详解
  • 从 Web1 到 Web3:互联网发展的历史与未来
  • ESP32学习笔记_FreeRTOS(6)——Event and Notification
  • openharmont驱动子系统
  • Wi-Fi 7、Wi-Fi 6 与 5G、4G 的全方位对比
  • ES语法学习2
  • 华为昇腾910B1基于 LoRA 的 Qwen2.5-7B-Instruct 模型微调
  • 通过ffmpeg将FLV文件转换为MP4
  • DPIN与CESS Network达成全球战略合作,推动DePIN与AI领域创新突破
  • Redis可视化工具--RedisDesktopManager的安装