当前位置: 首页 > 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;让一些基本不会改动的代码先…...

图片木马检测与防御:如何用PHP代码识别恶意图片上传(2024最新版)

图片木马检测与防御&#xff1a;2024年PHP实战指南 在数字化浪潮中&#xff0c;图片上传功能已成为网站标配&#xff0c;但这也为攻击者提供了可乘之机。去年某电商平台因图片木马导致百万用户数据泄露的事件&#xff0c;再次敲响了安全警钟。本文将深入剖析如何用PHP构建坚不可…...

LeetCodehot100-21 合并两个有序链表

class Solution { public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {if(list1nullptr||list2nullptr){return list1nullptr?list2:list1;}ListNode* headlist1->val<list2->val?list1:list2;ListNode* cur1head->next;ListNode* cur2headlist…...

单细胞分群避坑指南:为什么你的CD4+T细胞总被污染?(含清洗技巧)

单细胞分群避坑指南&#xff1a;为什么你的CD4T细胞总被污染&#xff1f;&#xff08;含清洗技巧&#xff09; 在单细胞测序数据分析中&#xff0c;CD4T细胞的分群常常让研究者头疼不已。明明按照标准流程操作&#xff0c;为什么我的CD4T细胞群总是混入其他细胞&#xff1f;这…...

MedGemma X-Ray开源大模型部署:医疗AI合规性与本地化实践

MedGemma X-Ray开源大模型部署&#xff1a;医疗AI合规性与本地化实践 1. 引言&#xff1a;当AI遇见医疗影像 想象一下&#xff0c;一位年轻的住院医师面对一张复杂的胸部X光片&#xff0c;需要快速判断是否存在肺炎、气胸或骨折的迹象。传统的阅片过程依赖经验积累&#xff0…...

DanKoe 视频笔记:赚钱是精神性的:破除“高尚的失败者”的迷思 [特殊字符]

在本节课中&#xff0c;我们将要学习一种关于金钱、商业和道德的全新视角。我们将探讨为何将赚钱视为不道德是一种幻觉&#xff0c;以及这种观念如何阻碍你为世界创造真正的价值。 在当今世界&#xff0c;最糟糕的事情之一就是陷入“高尚的失败者”的思维模式。许多聪明人讨厌…...

3步解锁音乐收藏新维度:从音质到视觉的全方位升级

3步解锁音乐收藏新维度&#xff1a;从音质到视觉的全方位升级 【免费下载链接】Netease_url 网易云无损解析 项目地址: https://gitcode.com/gh_mirrors/ne/Netease_url 在数字音乐收藏领域&#xff0c;我们常常面临三重困境&#xff1a;想听无损音质却受限于平台限制&a…...

从AudioLDM到商业应用:AI生成冥想音乐的技术全景与实战指南

从AudioLDM到商业应用&#xff1a;AI生成冥想音乐的技术全景与实战指南 引言 在快节奏的现代生活中&#xff0c;冥想作为一种有效的减压方式日益普及&#xff0c;而与之相伴的冥想音乐需求也持续增长。传统的音乐创作模式周期长、成本高&#xff0c;难以满足海量、个性化的需求…...

LaTeX科技论文写作:如何优雅地呈现SenseVoice-Small模型实验数据

LaTeX科技论文写作&#xff1a;如何优雅地呈现SenseVoice-Small模型实验数据 写论文&#xff0c;尤其是技术论文&#xff0c;最头疼的往往不是实验本身&#xff0c;而是如何把那些复杂的模型结构、密密麻麻的数据和曲线图&#xff0c;清晰又专业地呈现在纸上。你辛辛苦苦跑出来…...

lumenpnp校准–连接至 LumenPnP 并配置底部相机

总目录&#xff1a;https://www.xlzyw.top/archives/295 既然 OpenPnP 已安装并且 LumenPnP 配置文件已放置在隐藏的系统文件夹中&#xff0c;OpenPnP 可以使用一些基本的预配置设置启动了。下一步是连接您的 LumenPnP 并熟悉 OpenPnP 的用户界面。。 然后&#xff0c;我们将安…...

从Desat故障到设计哲学:构建高鲁棒性控制器的系统化方法

1. 从Desat故障现象说起&#xff1a;IGBT的"心脏病发作" 第一次遇到Desat故障报警时&#xff0c;我盯着示波器上跳动的波形百思不得其解——明明电路设计完全参照了芯片厂商的参考方案&#xff0c;为什么样机在高温测试时频繁报错&#xff1f;这种经历相信很多电力电…...