原创

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://shazhenyu.blog.csdn.net/article/details/86149979

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

文章最后发布于: 2019-01-09 14:13:34
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览