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开发:构建高效智能的嵌入式系统

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

【QT】基础入门学习

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

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

使用Qt编程QtNetwork无法使用

使用 VS 构建 Qt 项目时 QtNetwork 无法使用的问题 - 摘叶飞镖 - 博客园 (cnblogs.com) 另外,强烈建议在使用QNetworkAccessManager之前看看这篇文章: Qt 之 QNetworkAccessManager踏坑记录-CSDN博客 C++ Qt开发:QNetworkAccessManager网络接口组件 阅读目录 1.1 通用API函数

Qt多语种开发教程

Qt作为跨平台的开发工具,早已应用到各行各业的软件开发中。 今天讲讲,Qt开发的正序怎么做多语言开发。就是说,你设置中文,就中文显示;设置英语就英文显示,设置繁体就繁体显示,设置发育就显示法语等。 开发环境(其实多语种这块根环境没太大关系):win10,Qt.5.12.10 一.先用QtCreator创建一个简单的桌面程序 1.工程就随便命名“LanguageTest”,其他默认。 2.在设计师

Qt中window frame的影响

window frame 在创建图形化界面的时候,会创建窗口主体,上面会多出一条,周围多次一圈细边,这就叫window frame窗口框架,这是操作系统自带的。 这个对geometry的一些属性有一定影响,主要体现在Qt坐标系体系: 窗口当中包含一个按钮,这个按钮的坐标系是以父元素为参考,那么这个参考是widget本体作为参考,还是window frame作为参考,这两种参考体系都存在

【Qt】定时器事件

定时器事件 在之前学习QTimer中实现了定时器的功能,而在QTimer背后是QTimerEvent定时器事件进行支撑的。在QObject中提供了一个timeEvent这个函数。 startTimer启动定时器killTimer关闭定时器 Qt 中在进⾏窗⼝程序的处理过程中,经常要周期性的执⾏某些操作,或者制作⼀些动画效果,使⽤定 时器就可以实现。所谓定时器就是在间隔⼀定时间后,去执⾏某⼀

QT 编译报错:C3861: ‘tr‘ identifier not found

问题: QT 编译报错:C3861: ‘tr’ identifier not found 原因 使用tr的地方所在的类没有继承自 QObject 类 或者在不在某一类中, 解决方案 就直接用类名引用 :QObject::tr( )

在 Qt Creator 中,输入 /** 并按下Enter可以自动生成 Doxygen 风格的注释

在 Qt Creator 中,当你输入 /** 时,确实会自动补全标准的 Doxygen 风格注释。这是因为 Qt Creator 支持 Doxygen 以及类似的文档注释风格,并且提供了代码自动补全功能。 以下是如何在 Qt Creator 中使用和显示这些注释标记的步骤: 1. 自动补全 Doxygen 风格注释 在 Qt Creator 中,你可以这样操作: 在你的代码中,将光标放在

Qt: 详细理解delete与deleteLater (避免访问悬空指针导致程序异常终止)

前言 珍爱生命,远离悬空指针。 正文 delete 立即删除:调用 delete 后,对象会立即被销毁,其内存会立即被释放。调用顺序:对象的析构函数会被立即调用,销毁该对象及其子对象。无事件处理:如果在对象销毁过程中还涉及到信号和槽、事件处理等,直接 delete 可能会导致问题,尤其是在对象正在处理事件时。适用场景:适用于在确定对象已经不再被使用的情况下,并且不涉及异步处理或事件循环中的