Qt-高DPI显示器

2024-09-06 01:36
文章标签 qt 显示器 dpi

本文主要是介绍Qt-高DPI显示器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

与标准DPI显示器相比,高DPI显示器增加了像素密度。
像素密度以每英寸点数(DPI)或每英寸像素(PPI)来衡量,由显示像素的数量和它们的大小决定。因此,单独的像素数量不足以确定显示器是否属于高dpi类别。

4K显示器有固定的像素数(约8米),但它的DPI在185(23英寸)和110(40英寸)之间变化。前者是标准96 DPI桌面分辨率的两倍左右;后者仅略高于这个分辨率。

高DPI的挑战

高DPI显示给现有应用带来了一些挑战:

  • 使用固定坐标的UI设计的应用程序看起来很小
    • 以点为单位指定字体大小和以像素为单位指定其他大小的组合特别成问题,因为点与显示器的分辨率无关。例如,假设我们有一个40x20像素的帧围绕文本“hello”。如果我们使用12pt字体,它在低分辨率显示器上看起来应该是正确的。但是,在高DPI显示器上,帧会太小,导致文本被剪切。
  • 应用程序必须适应用户拥有不同分辨率的多个显示器的情况
    • 例如,用户可能在图像编辑器的文档窗口中使用4K显示器,但在工具箱中使用低分辨率显示器。

传统上,为了支持高DPI, Qt会自动缩放字体,并提供一个DPI值,应用程序代码可以使用该值来缩放UI的其余部分。

系统级别的高DPI支持

Qt支持高DPI模式,其中主坐标系统是虚拟化的,与显示像素密度无关。有些操作系统,如macOS和iOS实现了这种模式。此外,如果某个操作系统不支持这种模式,Qt也有一个备用实现。

现在,几何形状是在设备无关像素中指定的。这包括组件和项目的几何形状、事件的几何形状、桌面、窗口和屏幕的几何形状,以及动画的速度。输出以设备像素的形式呈现,对应于显示分辨率。devicePixelRatio是设备无关像素与设备像素坐标系之间的比率

通常,大多数应用程序都使用独立于设备的像素;除了OpenGL和光栅图形的代码。

操作系统支持

qt支持的操作系统提供以下高DPI显示:

macOS和iOS

苹果平台在操作系统中实现了可扩展和协调系统虚拟化。通常不需要特殊配置。

在macOS上,通过Info.plist文件设置启用高dpi支持;因此,请确保这些设置存在

<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSHighResolutionCapable</key>
<string>True</string>

最新版本的qmake使用NSPrincipalClass key生成Info.plist文件;这是足够的,因为NSHighResolutionCapable默认是true。

注意:macOS和iOS都可能应用进一步的虚拟化,这样设备像素不再对应于1:1的显示像素。这发生在iPhone 6+和macOS上,配置了“显示缩放”功能。

Microsoft Windows

缩放比例

用户可以从控制面板或通过上下文菜单选择比例因子。这是通过使查询系统指标的函数为标准字体大小、窗口边框大小等返回不同的值来实现的。它不执行任何实际的缩放

DPI感知

Windows上的应用程序可以假设以下级别之一的“DPI感知”

DPI Awareness LevelMeaning
DPI Unaware这个级别是在Windows Vista中引入的。对于应用程序,Windows假装它在1920x1080的96 DPI标准显示器上运行,并相应地缩放应用程序。它旨在适应为低DPI显示设计的旧应用程序。这种类型的缩放可能会导致一些工件。
System-DPI Aware这个级别是在Windows Vista中引入的。只有在连接多个监视器时,它才与逐监视器DPI感知不同。Windows计算出一个适用于所有连接的显示器的比例。
Per-Monitor DPI Aware该级别在Windows 8.1中引入。Windows根本不执行任何缩放。

默认情况下,Qt应用程序在Windows 8.1上被设置为逐监视器DPI感知或在旧版本的Windows上被设置为系统DPI感知。从Qt 5.4开始,这个级别可以通过平台插件的参数来指定:

<application> -platform windows:dpiawareness=0,1,2

Using qt.conf | Qt 5.15有关详细资料请参阅 Using qt.conf.

Qt高DPI支持

Qt提供了以下方法来处理应用程序中的高DPI支持。

  • 能够提供高分辨率的像素图或插图。有关详细信息,请参见Drawing High Resolution Versions of Pixmaps and Images.
  • Qt 5.6支持传统应用的跨平台高dpi扩展,类似于macOS原生的扩展。这允许为低DPI屏幕编写的应用程序在高DPI设备上不变地运行。此功能是可选的,可以使用以下环境变量启用:
    • QT_AUTO_SCREEN_SCALE_FACTOR[布尔值]启用自动缩放,基于显示器的像素密度。这不会改变点大小字体的大小,因为点是一个物理测量单位。多个屏幕可能会得到不同的比例因子。
    • QT_SCALE_FACTOR [numeric]定义了整个应用程序的全局缩放因子,包括点大小的字体。
    • QT_SCREEN_SCALE_FACTORS [list]指定每个屏幕的缩放因子。这不会改变点大小字体的大小。环境变量主要用于调试,或处理具有错误EDID信息(扩展显示标识数据)的监视器。
      • 格式可以是一个分号分隔的比例因子列表,其顺序与QGuiApplication::screens()相同,也可以是一个分号分隔的name=value对列表,其中name与QScreen::name()相同。

虽然macOS风格完全支持高dpi,但Windows桌面风格目前在某些比例因素上有一些限制。在这些情况下,考虑使用Fusion样式,它在所有情况下都支持高dpi。

虽然macOS风格完全支持高dpi,但Windows桌面风格目前在某些比例因素上有一些限制。在这些情况下,考虑使用Fusion样式,它在所有情况下都支持高dpi。

注意:非整数缩放因子可能导致显著的缩放/绘制伪影。

  • Qt::AA_EnableHighDpiScaling应用程序属性在Qt 5.6中引入,可以根据显示器的像素密度自动缩放。
  • Qt 5.6中引入的Qt::AA_DisableHighDpiScaling应用属性可以关闭所有的扩展功能。这适用于需要实际窗口系统坐标的应用程序,而无需考虑环境变量。该属性的优先级高于Qt::AA_EnableHighDpiScaling。
  • QT_ENABLE_HIGHDPI_SCALING环境变量在Qt 5.14中引入,可以根据显示器的像素密度自动缩放。替换QT_AUTO_SCREEN_SCALE_FACTOR。
  • Qt 5.14中引入的QT_SCALE_FACTOR_ROUNDING_POLICY环境变量和QGuiApplication::highDpiScaleFactorRoundingPolicy API可以控制设备像素比是否以及如何四舍五入到最近的整数。这与窗口150%缩放等配置相关。取值包括:Round、Ceil、Floor、RoundPreferFloor、PassThrough。有关选项的完整描述,请参阅Qt::HighDpiScaleFactorRoundingPolicy枚举文档。
  • 在Qt 5.4中,通过QT_DEVICE_PIXEL_RATIO环境变量引入了高DPI缩放的实验实现,您可以设置为数字缩放因子或自动。这个变量在Qt 5.6中已弃用。

转移现有应用程序

为了让一个为低DPI值设计的应用程序快速在高分辨率显示器上运行,请考虑以下之一:

  • 让应用程序在Windows上作为DPI自动运行,将QT_AUTO_SCREEN_SCALE_FACTOR环境变量设置为1。

然而,这些选项可能会导致一些缩放或绘制工件。

从长远来看,应用程序应该适应运行而无需修改:

  • 始终使用QPainter绘图API的qreal版本。
  • 窗口和对话框相对于相应的屏幕大小。
  • 将布局和绘图代码中硬编码的尺寸替换为根据字体度量或屏幕大小计算的值。

高DPI术语表

TermDefinition
Device Independent Pixels应用程序使用的像素(用户空间),取决于操作系统或Qt的缩放。
Device Pixels显示设备的像素。
Device Pixel Ratio操作系统或Qt应用的比例因子。
Logical DPI用于将以点为单位定义的字体大小转换为以像素为单位的字体大小的分辨率。标准值是96、128、…192.
Physical DPI显示器的大小除以像素数得到的物理分辨率。
User Space应用程序在设备无关像素中使用的坐标空间。

High DPI Displays | Qt 5.15

这篇关于Qt-高DPI显示器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140631

相关文章

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是