首页 > 其他分享 >Qt on Mac 开发之 Qt在Retina屏幕上的那些问题

Qt on Mac 开发之 Qt在Retina屏幕上的那些问题

时间:2022-10-31 20:34:03浏览次数:72  
标签:Qt devicePixelRatio dips Retina 像素 Mac 屏幕


目录

  • ​​1、解决Qt在Retina屏幕上的图片模糊问题​​
  • ​​2、解决Qt在Retina屏幕上的密度问题​​
  • ​​1. iOS​​
  • ​​2. Android​​
  • ​​3. 视网膜MacBook​​
  • ​​3、解决Qt在Retina屏幕上的刷新问题​​

1、解决Qt在Retina屏幕上的图片模糊问题

说到这个问题,我们要用到QT_REQUIRE_VERSION这个宏,Qt文档中这么描述:

Qt on Mac 开发之 Qt在Retina屏幕上的那些问题_刷新


这里是要设置的与当前使用的Qt版本相匹配。

比如:
用的是Qt5.6.0,就要在main.cpp上这样写:

#include "mainwindow.h"

#include <QApplication>
#include <QMessageBox> For QT_REQUIRE_VERSION

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QT_REQUIRE_VERSION(argc, argv, "5.6.0");
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);//解决Qt在Retina屏幕上图片模糊问题
MainWindow w;
w.show();
return a.exec();
}

核心代码:

QT_REQUIRE_VERSION(argc, argv, "5.6.0");
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);//解决Qt在Retina屏幕上图片模糊问题

2、解决Qt在Retina屏幕上的密度问题

说起Retina屏幕,大部分还被用在如今正火的苹果MacBook Pro(13、15英寸)、苹果iPhone系列手机(4、4S、5、5s、6、6plus等)、苹果iPad系列平板电脑(第四代iPad air及iPad air2)都是用的Retina屏幕。正是由于苹果越来越进入到我们的生活中,所以Retina屏幕所关联的devicePixelRatio属性也慢慢登上了前端技术的舞台。

devicePixelRatio是设备上物理像素和设备独立像素(device-independent pixels (dips))的比例。
公式表示:devicePixelRatio = 物理像素 / dips。

在Qt中,我们通过

int ratio = QApplication::desktop()->screen()->devicePixelRatio();

获取数值,普通屏幕获取的值为1,而Retina屏幕获取的值为2
在开发Retina屏幕的应用时,注意Image和pixmap在缩放时会受这个值的影响哦

devicePixelRatio缩写,dip或dp,(device independent pixels,设备独立像素)与屏幕密度有关。dip可以用来辅助区分视网膜设备还是非视网膜设备。
以下列举了几个平台的实例:

1. iOS

无视网膜设备devicePixelRatio值为1,视网膜设备为2. 因为实际的像素个数是双倍。不过,iphone似乎不愿意改变大家都熟知习惯的320像素宽度布局,没有把设备宽度一下子变成640像素,因此,dips宽度依然是320, 于是devicePixelRatio就是640/320 = 2.

iOS上的情况要相对简单些,除了1就是2. 在其他平台也基本上很简单,因为一般分辨率都比较挫,devicePixelRatio都是1.

2. Android

谷歌的Nexus One应该是第一个使用dips的,比iphone早。同时Galaxy Nexus以及Galaxy Note都是类运动视网膜显示器

Nexus One分辨率是480*800, 为了最优的页面浏览,Android WebKit团队决定纵向手持时候的宽度依然是320像素,因此,devicePixelRatio值为480/320 = 1.5.
在同一手机上,Opera Mobile有相同的结论,dips为320宽,devicePixelRatio也是1.5 .

顺便提一下,BlackBerry Torch 9810(OS7)物理像素同样480像素,BlackBerry WebKit团队决定坚持devicePixelRatio为1. 这可能是更不错的做法,在Torch显示器上480px宽度站点或多或少有些难以阅读。

Galaxy Nexus有像素的提升,为720×1200. Android团队决定提高dips层的宽度到360像素。从而使devicePixelRatio为720/360 = 2. Chrome团队决定跟进,就如腾讯QQ浏览器所做的那样。

然而,Opera,坚持自我,dips宽度为320px, 于是devicePixelRatio为720/320 = 2.25. 不过似乎还与zoom缩放层级有关。

Galaxy Note物理像素为800×1200. 这里所有浏览器都决定使用与Galaxy Nexus一样的比率:Android WebKit, Chrome, 以及QQ都是2,也就意味着其dips宽度为400px. 然而,Opera依然一意孤行2.25, 于是其dips宽度值有些怪怪的: 356px.

Android标准似乎不严格,于是自家人玩自家人的游戏,对于开发者而言,可能又会面临苦逼~~

3. 视网膜MacBook

新的MacBook采用视网膜显示屏,其devicePixelRatio是(如果不出意外)2. 视网膜MacBook的物理像素是2800×1800,而显示出分辨率为1400×900,如果把分辨率作为dips层,则devicePixelRatio为2应该是无误的。

需要指出的是,如果你把分辨率改成1920×1200,devicePixelRatio依然是2. 严格来讲,这是不准确的,应该是1.5, 然而你也可以说MacBook的分辨率不同于dips层,这种情况下devicePixelRatio在台式机/笔记本下的定义就不一样(哪一个?不知道。)。

在任何情况下,根据苹果的规范做法,devicePixelRatio值只可能是1或者2. 如果你看到2,你要提供视网膜优化显示图片,如果是1,使用正常的图片——(这里内容其实属于视网膜站点的开发内容)。

3、解决Qt在Retina屏幕上的刷新问题

QLabel 在 Retina屏幕上的改变大小显示时出现错误,不是报错,而是在移动的时候显示有问题。

同一程序在Android,Windows,Linux上都没有问题,
甚至是IOS和MAC的非Retina屏幕也都无此问题,

只有在苹果的Retina屏幕上有问题。

经验证是Qt的Bug,希望Qt工作人员尽快解决此问题。
可以暂时利用QGraphicTextItem这个类来代替QLabel这个类。或者用QtQuick来代替QtWidgets


标签:Qt,devicePixelRatio,dips,Retina,像素,Mac,屏幕
From: https://blog.51cto.com/u_15854865/5811179

相关文章

  • Qt on Android 开发之 添加SSL、应用签名、解决“No CPU/ABI system image available
    目录​​一、Qt如何给Android添加SSL库​​​​1、简述​​​​2、步骤​​​​二、Android应用签名问题​​​​1、签名原因​​​​2、签名作用​​​​3、如何添加签名​......
  • Qt5气泡式聊天框——QListWidget+QPainter实现
    文章目录​​1、简介​​​​2、效果图​​​​3、实现原理​​​​4、核心代码​​​​4.1、头文件​​​​4.2、源文件​​​​5、代码分享​​​​5.1、Github​​​​5.......
  • Qt制作简单和高级SplashScreen(程序启动页面)
    一、简单的制作SplashScreenQt本来自带QSplashScreen类,这个简单的类提供了个简单的方法就是在程序启动前提供一个图片让其先启动,等我们主程序启动后这个启动页面消失。可以......
  • Qt输出打印信息的日志到文件(两种方式)
    效果: 1、利用ofstream文件写操作,将内存数据写入存储文件。找到main.cpp:①、增加头文件引用:#include<QDateTime>#include<QDebug>#include<fstream>//std::ofstre......
  • Qt on Android 开发之 C++与Java 交互
    目录​​简述​​​​Qt引入Android模块​​​​Java示例​​​​Cpp与java交互​​简述我做了一个小例子,来实现了C++与Java之间的交互。该示例是以整形和字符型举例说明,......
  • QT之自制Slider
    需求: 1.绘制一个滑动条,在其上方绘制三角形, 2.当鼠标进入(移动)到三角形区域时显示对应的标注值 3.鼠标双击时三角形时,滑块移动到该位置 4.鼠标单击滑块槽时,......
  • [nrf52][SDK17] 如何修改BLE_MAC地址?
    关键部分:ble_gap_addr_tble_mac_addr={0};sd_ble_gap_addr_get(&ble_mac_addr);//先获取ble当前mac地址ble_mac_addr.addr[0]++;//地址加1.......
  • TablePlus for mac/win(原生数据库开发管理应用)
    TablePlus是一款管理开发数据库的原生应用,它可以帮助您轻松编辑数据库中的数据和结构。TablePlus还包含许多安全功能以更好地保护您的数据安全,包括使用本地libssh和TLS来加......
  • Qt设置运行时动态库路径的几点说明
    Qt设置运行时动态库路径的几点说明Qt教程 2022-04-1601:00随着需求的不断增加,程序不断变大,用到的动态库也越来越多,到了发布程序的时候你会发现和可执行文件同一目录下......
  • VMware WorkStation Pro 16安装MacOS 13 ,12手把手图文教程(全流程详细图解)
    因为工作需要使用VMwarePro16虚拟机进行安装MacOS12系统(macOS13安装同样教程,同样附了macOS13的下载,这里就以12为例进行了安装)下面我就把自己安装的过程以及需要的文......