目录
- 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_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