Qt on Mac 开发之 Qt在Retina屏幕上的那些问题
目录
- 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屏幕上的那些问题相关推荐
- android qt 串口通信,Qt串口通信开发之QSerialPort模块详细使用方法与实例
Qt串口通信开发之QSerialPort模块详细使用方法与实例 发布时间:2020-10-23 12:19:05 来源:脚本之家 阅读:111 作者:沧海一笑-dj Qt串口通信基础及名词说明 串口通 ...
- tablewidget 多行表头_Qt GUI图形图像开发之QT表格控件QTableView,QTableWidget复杂表头(多行表头) 及冻结、固定特定的行的详细方法与实例...
我们在开发过程中对于表格使用频率还是挺高的,使用QT框架开发时候我们使用QTableView或者QTableWidget创建表格. 其中表格分为 表格头与表格体: 对于简单地表格,我们可以设置表头来满 ...
- Mac版微信取消在锁定屏幕上显示通知的操作方法?
在日常中使用Mac版微信如果不想在锁定屏幕上显示通知,可将该功能关闭.那我们该如何关闭呢?跟小编一起来看看具体教程吧- 微信Mac版客户端(支持查看朋友圈)正式版支持M1芯片 方法步骤如下: 1.首先 ...
- html5 retina 1像素,HTML5 canvas 在 iPhone 4 retina 屏幕上的优化
HTML5 canvas 在 iPhone 4 retina 屏幕上的优化 mac52ipod· 2011-02-11 阅读数 7793 随着 iPhone4 的推出, retina 屏在移动设备中被 ...
- Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例
QT表格控件QTableView简介 表格视图控件QTableView,需要和QStandardItemModel, 配套使用,这套框架是基于MVC设计模式设计的,M(Model)是QStanda ...
- qtabwidget设置表头_Qt GUI图形图像开发之QT表格控件QTableView,QTableWidget复杂表头(多行表头) 及冻结、固定特定的行的详细方法与实例...
我们在开发过程中对于表格使用频率还是挺高的,使用QT框架开发时候我们使用QTableView或者QTableWidget创建表格. 其中表格分为 表格头与表格体: 对于简单地表格,我们可以设置表头来满 ...
- Flutter开发之ListView下拉刷新上拉加载更多(35)
在Flutter开发之ListView组件(21) 文章中,我们了解了ListView组件的基本使用.但是数据比较少,没有涉及分页加载.而实际开发中,下拉刷新和分页加载几乎是所有APP的标配.在iOS ...
- bpmn 文件 服务器部署,Liferay7 BPM门户开发之45: 集成Activiti文件上传部署流程BPMN模型...
开发文件上传,部署流程模板. 首先,开发jsp页面,deploy.jsp ${RETURN_MESSAGE} 其中,上传form的action为portlet:actionURL,它的name就是在p ...
- 图像化界面开发之QT入门
想要完成一个应用程序的开发,通常还需要一个可视化界面,QT就是可以帮助我们快速开发出可视化界面的一款工具,而利用QT实现页面布局,一般有两种方式,即通过qtdesigner和通过纯代码构建,第一种方式 ...
最新文章
- 批量修改文件名称(Python)
- 存储过程内建临时表和临时函数,合并一个由存储过程返回的表
- 当用户控件有异动时,网页某部位作出相应变化
- python分析双十一销量
- java 获取400的错误信息_获取400错误的请求Spring RestTemplate POST
- Thinkphp ajax分页
- matlab 功率谱分析函数psd用法
- go 返回mysql数组_Go基础之--操作Mysql(一)
- vb红绿灯自动切换_VB红绿灯程序
- 设置导航栏的相关属性
- 宏定义是写在.h文件里还是.c文件里
- e300氛围灯哪里调节_保时捷macan内饰改装升级32色呼吸氛围灯
- 京东sdk调用实例_Apache ShardingSphere(Incubating)对接京东白条实战
- java网络编程,HttpClient 应用~
- 零基础学python pdf-Python pdf(零基础入门学习Python)V1.0 最新版
- 网络操作系统第224页作业
- android qq输入法表情,QQ输入法如何输入表情
- Python常用模块15-python的configparser模块
- 新路由3详细刷机教程
- Acrel-7000企业能源管控平台助力新疆某企业实现双碳双控
热门文章
- Docker failed to initialize
- 牛客网基础题-有容乃大
- Visual Studio Code 配置C/C++
- CENTOS7 使用 Nginx + Uwsgi 部署 Django 项目
- 【通知短信API】简单易用,三秒必达
- 桌面安装计算机,获取新计算机或重新安装Windows后快速安装桌面程序的4种方法 | MOS86...
- java基于springboot高校课程评价系统maven idea
- 有关(_DWORD *)的解释
- python tokenizer,用Python词法分析Parser中tokenizer.h的实际应用
- 前端学习之旅——HTML