目录

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

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

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

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

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

#include "mainwindow.h"#include <QApplication>
#include <QMessageBox> For QT_REQUIRE_VERSIONint 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 on Mac 开发之 Qt在Retina屏幕上的那些问题相关推荐

  1. android qt 串口通信,Qt串口通信开发之QSerialPort模块详细使用方法与实例

    Qt串口通信开发之QSerialPort模块详细使用方法与实例 发布时间:2020-10-23 12:19:05 来源:脚本之家 阅读:111 作者:沧海一笑-dj Qt串口通信基础及名词说明 串口通 ...

  2. tablewidget 多行表头_Qt GUI图形图像开发之QT表格控件QTableView,QTableWidget复杂表头(多行表头) 及冻结、固定特定的行的详细方法与实例...

    我们在开发过程中对于表格使用频率还是挺高的,使用QT框架开发时候我们使用QTableView或者QTableWidget创建表格. 其中表格分为 表格头与表格体: 对于简单地表格,我们可以设置表头来满 ...

  3. Mac版微信取消在锁定屏幕上显示通知的操作方法?

    在日常中使用Mac版微信如果不想在锁定屏幕上显示通知,可将该功能关闭.那我们该如何关闭呢?跟小编一起来看看具体教程吧- 微信Mac版客户端(支持查看朋友圈)正式版支持M1芯片 方法步骤如下: 1.首先 ...

  4. html5 retina 1像素,HTML5 canvas 在 iPhone 4 retina 屏幕上的优化

    HTML5 canvas 在 iPhone 4 retina 屏幕上的优化 mac52ipod· 2011-02-11 阅读数 7793 随着 iPhone4 的推出, retina 屏在移动设备中被 ...

  5. Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例

    QT表格控件QTableView简介 ​ 表格视图控件QTableView,需要和QStandardItemModel, 配套使用,这套框架是基于MVC设计模式设计的,M(Model)是QStanda ...

  6. qtabwidget设置表头_Qt GUI图形图像开发之QT表格控件QTableView,QTableWidget复杂表头(多行表头) 及冻结、固定特定的行的详细方法与实例...

    我们在开发过程中对于表格使用频率还是挺高的,使用QT框架开发时候我们使用QTableView或者QTableWidget创建表格. 其中表格分为 表格头与表格体: 对于简单地表格,我们可以设置表头来满 ...

  7. Flutter开发之ListView下拉刷新上拉加载更多(35)

    在Flutter开发之ListView组件(21) 文章中,我们了解了ListView组件的基本使用.但是数据比较少,没有涉及分页加载.而实际开发中,下拉刷新和分页加载几乎是所有APP的标配.在iOS ...

  8. bpmn 文件 服务器部署,Liferay7 BPM门户开发之45: 集成Activiti文件上传部署流程BPMN模型...

    开发文件上传,部署流程模板. 首先,开发jsp页面,deploy.jsp ${RETURN_MESSAGE} 其中,上传form的action为portlet:actionURL,它的name就是在p ...

  9. 图像化界面开发之QT入门

    想要完成一个应用程序的开发,通常还需要一个可视化界面,QT就是可以帮助我们快速开发出可视化界面的一款工具,而利用QT实现页面布局,一般有两种方式,即通过qtdesigner和通过纯代码构建,第一种方式 ...

最新文章

  1. 批量修改文件名称(Python)
  2. 存储过程内建临时表和临时函数,合并一个由存储过程返回的表
  3. 当用户控件有异动时,网页某部位作出相应变化
  4. python分析双十一销量
  5. java 获取400的错误信息_获取400错误的请求Spring RestTemplate POST
  6. Thinkphp ajax分页
  7. matlab 功率谱分析函数psd用法
  8. go 返回mysql数组_Go基础之--操作Mysql(一)
  9. vb红绿灯自动切换_VB红绿灯程序
  10. 设置导航栏的相关属性
  11. 宏定义是写在.h文件里还是.c文件里
  12. e300氛围灯哪里调节_保时捷macan内饰改装升级32色呼吸氛围灯
  13. 京东sdk调用实例_Apache ShardingSphere(Incubating)对接京东白条实战
  14. java网络编程,HttpClient 应用~
  15. 零基础学python pdf-Python pdf(零基础入门学习Python)V1.0 最新版
  16. 网络操作系统第224页作业
  17. android qq输入法表情,QQ输入法如何输入表情
  18. Python常用模块15-python的configparser模块
  19. 新路由3详细刷机教程
  20. Acrel-7000企业能源管控平台助力新疆某企业实现双碳双控

热门文章

  1. Docker failed to initialize
  2. 牛客网基础题-有容乃大
  3. Visual Studio Code 配置C/C++
  4. CENTOS7 使用 Nginx + Uwsgi 部署 Django 项目
  5. 【通知短信API】简单易用,三秒必达
  6. 桌面安装计算机,获取新计算机或重新安装Windows后快速安装桌面程序的4种方法 | MOS86...
  7. java基于springboot高校课程评价系统maven idea
  8. 有关(_DWORD *)的解释
  9. python tokenizer,用Python词法分析Parser中tokenizer.h的实际应用
  10. 前端学习之旅——HTML