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

Qt获取屏幕DPI缩放比

获取屏幕缩放比

网上很多代码是用 logicalDotsPerInch 除以 96 来获取屏幕缩放比:

// Windows 除以 96,macOS 除以 72
qreal factor = window->screen()->logicalDotsPerInch() / 96.0;

当使能了缩放适配后,logicalDotsPerInch 值就不随系统缩放变了:

#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)// Qt6 默认开启缩放QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
#endif

如果是 PassThrough 支持小数的设置,此时可以用 QScreen 的 devicePixelRatio 获取缩放比。

很明显,我们需要更通用的方式。通过查看源码,发现其实 Qt 内部是有对应接口的,比如 QHighDpiScaling 类的接口:

qreal QHighDpiScaling::rawScaleFactor(const QPlatformScreen *screen)
{// Determine if physical DPI should be usedstatic const bool usePhysicalDpi = qEnvironmentVariableAsBool(usePhysicalDpiEnvVar, false);// Calculate scale factor beased on platform screen DPI valuesqreal factor;QDpi platformBaseDpi = screen->logicalBaseDpi();if (usePhysicalDpi) {QSize sz = screen->geometry().size();QSizeF psz = screen->physicalSize();qreal platformPhysicalDpi = ((sz.height() / psz.height()) + (sz.width() / psz.width())) * qreal(25.4 * 0.5);factor = qreal(platformPhysicalDpi) / qreal(platformBaseDpi.first);} else {const QDpi platformLogicalDpi = QPlatformScreen::overrideDpi(screen->logicalDpi());factor = qreal(platformLogicalDpi.first) / qreal(platformBaseDpi.first);}return factor;
}

其中  usePhysicalDpi 一般我们也用不到,所以可以直接用 else 部分的逻辑。不过这里用到了 QPlatformScreen 类,需要引入 gui-private 模块:

QT += core gui widgets 
QT += gui-private

简单的测试:

void MainWindow::calcDpi()
{// 可以从 QWidget 或者 QWindow 拿到 QScreen 对象QScreen *cur_screen = this->screen();qDebug()<<__FUNCTION__<<cur_screen;if (cur_screen) {// 逻辑 dpi (logicalBaseDpi().first) 默认值 win 96/ mac 72const QDpi base_dpi = cur_screen->handle()->logicalBaseDpi();const QDpi logic_dpi = QPlatformScreen::overrideDpi(cur_screen->handle()->logicalDpi());// 得到屏幕缩放百分比const qreal factor = qreal(logic_dpi.first) / qreal(base_dpi.first);qDebug()<<"calc dpi"<<factor;}
}

关联屏幕设置变化

当在多个屏幕拖动,或者修改当前屏幕缩放比后,我们需要重新获取缩放比。

QWindow 提供了 screenChanged 信号可以感知屏幕切换。

QScreen 提供了 physicalDotsPerInchChanged 和 logicalDotsPerInchChanged 信号可以感知分辨率变化。

在 Widgets 中的大致代码就是:

void MainWindow::initWindow()
{qDebug()<<this->winId();// 构造的时候 windowHandle 还未初始化,可以等 show 的时候关联,或者先调用一次 winIdconnect(this->windowHandle(), &QWindow::screenChanged, this, &MainWindow::onScreenChange);calcDpi();
}void MainWindow::onScreenChange(QScreen *screen)
{// QMetaObject::Connection 保存连接便于释放;if (logicalDpiConnection) {disconnect(physicalDpiConnection);disconnect(logicalDpiConnection);}if (screen) {// 切换缩放比时,EnableHighDpiScaling 会触发 physicalDotsPerInchChanged// 此时 Qt6 不触发 logicalDotsPerInchChangedphysicalDpiConnection = connect(screen, &QScreen::physicalDotsPerInchChanged, this, &MainWindow::calcDpi);logicalDpiConnection = connect(screen, &QScreen::logicalDotsPerInchChanged, this, &MainWindow::calcDpi);calcDpi();}
}void MainWindow::calcDpi()
{// 可以从 QWidget 或者 QWindow 拿到 QScreen 对象QScreen *cur_screen = this->screen();qDebug()<<__FUNCTION__;if (cur_screen) {// 逻辑 dpi (logicalBaseDpi().first) 默认值 win 96/ mac 72const QDpi base_dpi = cur_screen->handle()->logicalBaseDpi();const QDpi logic_dpi = QPlatformScreen::overrideDpi(cur_screen->handle()->logicalDpi());// 得到屏幕缩放百分比const qreal factor = qreal(logic_dpi.first) / qreal(base_dpi.first);qDebug()<<"calc dpi"<<factor;}
}

完成示例代码:

QWidget 获取 DPI 缩放:https://github.com/gongjianbo/MyTestCode/tree/master/Qt/TestQt_20231221_Dpi

QML 获取 DPI 缩放:

https://github.com/gongjianbo/MyTestCode/tree/master/Qml/TestQml_20231221_Dpi

相关文章:

Qt获取屏幕DPI缩放比

获取屏幕缩放比 网上很多代码是用 logicalDotsPerInch 除以 96 来获取屏幕缩放比&#xff1a; // Windows 除以 96&#xff0c;macOS 除以 72 qreal factor window->screen()->logicalDotsPerInch() / 96.0; 当使能了缩放适配后&#xff0c;logicalDotsPerInch 值就不…...

Spring MVC控制层框架

三、Spring MVC控制层框架 目录 一、SpringMVC简介和体验 1. 介绍2. 主要作用3. 核心组件和调用流程理解4. 快速体验 二、SpringMVC接收数据 1. 访问路径设置2. 接收参数&#xff08;重点&#xff09; 2.1 param 和 json参数比较2.2 param参数接收2.3 路径 参数接收2.4 json参…...

vmware安装银河麒麟V10高级服务器操作系统

vmware安装银河麒麟V10高级服务器操作系统 1、下载银河麒麟V10镜像2、VMware安装银河麒麟V10高级服务器操作系统2.1、新建虚拟机2.2、安装虚拟机 3、配置银河麒麟V10高级服务器操作系统3.1、安装vmware tools3.2、配置静态IP地址 和 dns3.3、查看磁盘分区3.4、查看系统版本 1、…...

掌握Jenknis基础概念

目录 任务&#xff08;Jobs&#xff09; 构建&#xff08;Builds&#xff09; 触发器&#xff08;Triggers&#xff09; 构建环境&#xff08;Build Environment&#xff09;&#xff1a; 插件&#xff08;Plugins&#xff09;&#xff1a; 参数化构建&#xff08;Paramet…...

AWS 知识二:AWS同一个VPC下的ubuntu实例通过ldapsearch命令查询目录用户信息

前言&#xff1a; 前提&#xff1a;需要完成我的AWS 知识一创建一个成功运行的目录。 主要两个重要&#xff1a;1.本地windows如何通过SSH的方式连接到Ubuntu实例 2.ldapsearch命令的构成 一 &#xff0c;启动一个新的Ubuntu实例 1.创建一个ubuntu实例 具体创建实例步骤我就不…...

Ubuntu 常用命令之 fdisk 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 fdisk 是一个用于处理磁盘分区的命令行工具&#xff0c;它在 Linux 系统中广泛使用。fdisk 命令可以创建、删除、更改、复制和显示硬盘分区&#xff0c;以及更改硬盘的分区 ID。 fdisk 命令的常用参数如下 -l&#xff1a;列出所…...

论文中公式怎么降重 papergpt

大家好&#xff0c;今天来聊聊论文中公式怎么降重&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 论文中公式怎么降重 一、引言 在论文撰写过程中&#xff0c;公式是表达学…...

27. 过滤器

Filter(过滤器)简介 Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截&#xff0c;从而在 Servlet 进行响应处理的前后实现一些特殊的功能。在 Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序&#xff1a;Filter, FilterChain, FilterConfigFi…...

做一个wiki页面是体验HTML语义的好方法

HTML语义&#xff1a;如何运用语义类标签来呈现Wiki网页 在上一篇文章中&#xff0c;我花了大量的篇幅和你解释了正确使用语义类标签的好处和一些场景。那么&#xff0c;哪些场景适合用到语义类标签呢&#xff0c;又如何运用语义类标签呢&#xff1f; 不知道你还记不记得在大…...

金融CRM有用吗?金融行业CRM有哪些功能

市场形式波诡云谲&#xff0c;金融行业也面临着资源体系分散、竞争力后继不足、未知风险无法规避等问题。金融企业该如何解决这些问题&#xff0c;或许可以了解一下CRM管理系统&#xff0c;和其提供的金融行业CRM解决方案。 金融行业是银行业、保险业、信托业、证券业和租赁业…...

@XmlAccessorType+@XmlElement完美解决Java类到XML映射问题

前言&#xff1a; 最近项目在做静态代码扫描的时候&#xff0c;出现Java类中成员变量命名的问题&#xff0c;开头字母必须小写&#xff0c;但是这个类成员是对接其他公司的字段&#xff0c;对方提供的请求格式是XML&#xff0c;必须将Java类转化为XML的格式&#xff0c;而且这…...

软件渗透测试有哪些测试流程?权威安全测试报告的重要性

软件渗透测试也是安全测试的一种&#xff0c;是通过模拟恶意黑客的攻击方法&#xff0c;来评估计算机网络系统安全的一种评估方法。作为网络安全防范的一种新技术&#xff0c;对于网络安全组织具有实际应用价值。 一、软件渗透测试的过程   软件渗透测试的过程通常包括四个主…...

安防视频融合云平台/智慧监控平台EasyCVR如何添加验证码调用接口?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...

浏览器输入一个url,它的解析过程

URL解析&#xff1a; 浏览器首先解析URL&#xff0c;提取其中的协议&#xff08;例如&#xff0c;HTTP、HTTPS&#xff09;、域名和路径等信息。这个过程被称为URL解析。 DNS解析&#xff1a; 浏览器会检查域名的IP地址是否已经缓存。如果没有缓存或者缓存已经过期&#xff0c;…...

第29节: Vue3 列表渲染

在UniApp中使用Vue3框架时&#xff0c;你可以使用列表渲染语法来动态地渲染一个列表。下面是一个示例&#xff0c;演示了如何在UniApp中使用Vue3框架使用列表渲染&#xff1a; <template> <view> <button click"addItem">Add Item</button&g…...

CloudPulse:一款针对AWS云环境的SSL证书搜索与分析引擎

关于CloudPulse CloudPulse是一款针对AWS云环境的SSL证书搜索与分析引擎&#xff0c;广大研究人员可以使用该工具简化并增强针对SSL证书数据的检索和分析过程。 在网络侦查阶段&#xff0c;我们往往需要收集与目标相关的信息&#xff0c;并为目标创建一个专用文档&#xff0c…...

【网络安全】学习Web安全必须知道的一本书

【文末送书】今天推荐一本网络安全领域优质书籍。 目录 正文实战案例1&#xff1a;使用Docker搭建LAMP环境实战案例2&#xff1a;使用Docker搭建LAMP环境文末送书 正文 学习Web安全离不开Web&#xff0c;那么&#xff0c;需要先来学习网站的搭建。搭建网站是每一个Web安全学习…...

千帆 AppBuilder 初体验,不仅解决解决了我筛选简历的痛苦,更是让提效10倍!

文章目录 &#x1f31f; 前言&#x1f31f; 什么是百度智能云千帆 AppBuilder&#x1f31f; 百度智能云千帆 AppBuilder 初体验&#x1f31f; 利用千帆AppBuilder搭建简历小助手&#x1f31f; 让人眼前一亮的神兵利器 - 超级助理 &#x1f31f; 前言 前两天朋友 三掌柜 去北京…...

Ubuntu 常用命令之 cal 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 cal命令在Ubuntu系统下用于显示日历。它可以显示任何特定月份或整个年份的日历。 cal命令的参数如下 -1&#xff1a;只显示当前月份的日历。-3&#xff1a;显示前一个月、当前月和下一个月的日历。-s&#xff1a;指定日历的开始…...

项目中webpack优化配置(1)

项目中webpack优化配置 一. 开发效率&#xff0c; 体验 1. DLL&#xff08;开发过程中减少构建时间和增加应用程序的性能&#xff09; 使用 DllPlugin 进行分包&#xff0c;使用 DllReferencePlugin(索引链接) 对 manifest.json 引用&#xff0c;让一些基本不会改动的代码先…...

禅论结构量化:通达信可视化分析插件的算法实现与实践应用

禅论结构量化&#xff1a;通达信可视化分析插件的算法实现与实践应用 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 禅论量化分析插件通过算法自动识别K线图中的线段结构和中枢区域&#xff0c;为交易者…...

# 软考软件设计师每日精练 | 2026-04-25

&#x1f4dd; 软考软件设计师每日精练 | 2026-04-25&#x1f4c5; 距离2026年5月23日软考还有 28天&#xff01; 今日重点&#xff1a;算法策略辨析 线性规划 知识产权深化 项目管理工具&#x1f3af; 模块一&#xff1a;算法策略辨析&#xff08;必考 ★★★★★&#xff…...

新手必看:PCB设计全流程详解

1、画原理图不会画就先抄板子设计-更新转化为PCB2、画PCB&#xff08;1&#xff09;大概整理好之后自动布线GND不连&#xff08;2&#xff09;铺铜 &#xff08;顶层和底层都铺&#xff09;&#xff08;3&#xff09;DRC检查解决问题-重建铺铜区3、丝印层添加文字4、最后一步一…...

Tauri + Next.js 桌面应用开发:从架构到部署的完整实践指南

1. 项目概述&#xff1a;一个现代桌面应用开发的“瑞士军刀” 最近在折腾一个桌面端的小工具&#xff0c;需要把Web前端那套东西打包成一个独立的桌面应用。一开始想着用Electron&#xff0c;毕竟生态成熟&#xff0c;但一想到那动辄上百兆的安装包和不算低的内存占用&#xf…...

Python pip升级报错怎么办_强制更新与重新安装pip方法

...

5大核心能力重构GTA5 Online体验:从繁琐操作到高效游戏的全流程指南

5大核心能力重构GTA5 Online体验&#xff1a;从繁琐操作到高效游戏的全流程指南 【免费下载链接】GTA5OnlineTools GTA5线上小助手 项目地址: https://gitcode.com/gh_mirrors/gt/GTA5OnlineTools 你是否厌倦了在洛圣都的街头重复着机械性的操作&#xff1f;是否曾为了完…...

DOIP认知

1&#xff0c;概述 DOIP&#xff08;Diagnostic communication over Internet Protocol&#xff09;是基于以太网传输诊断数据的协议&#xff0c;规范于ISO13400标准。其核心功能是在TCP/IP协议栈之上构建诊断通信层&#xff0c;实现外部测试设备与车载网络之间的连接。 在ISO七…...

questasim下载安装

questasim下载安装 https://zhuanlan.zhihu.com/p/682726018...

Windows 一键部署 OpenClaw 教程|5 分钟搭建本地 AI 智能体,轻松搞定复杂配置

OpenClaw 2.7.1 接入阿里云百炼超详细图文教程 &#x1f4cb; 前置准备 本地已安装并能正常运行 OpenClaw 2.7.1 WindowsOpenClaw 顶部 Gateway 保持在线状态拥有可正常登录的阿里云账号网络可正常访问阿里云百炼控制台&#xff1a; https://bailian.console.aliyun.com/cn-be…...

HiveWE:现代化魔兽争霸III地图编辑器完全指南

HiveWE&#xff1a;现代化魔兽争霸III地图编辑器完全指南 【免费下载链接】HiveWE A Warcraft III world editor. 项目地址: https://gitcode.com/gh_mirrors/hi/HiveWE 还在为魔兽争霸III原版地图编辑器缓慢的加载速度和复杂的操作而烦恼吗&#xff1f;HiveWE作为一款专…...