美文网首页
Qt for Android屏幕DPI计算方法

Qt for Android屏幕DPI计算方法

作者: Qt工坊 | 来源:发表于2019-03-20 17:06 被阅读0次

关于手机屏幕像素密度(DPI),网络上有许多相关介绍,但真正能够在Qt for Android开发中成功使用的方法,我没有找到过。经过一番调研,我得出本文介绍的方法,并在多个Android手机上测试通过,现分享给大家。

获得设备像素密度值有何作用

可以根据像素密度值选择不同的UI资源文件,达到让应用程序适配不同屏幕大小的目的,而不会因为屏幕的像素颗粒大小的不同,而影响正常显示。

一个奇怪现象

QRect screenRect = QGuiApplication::primaryScreen()->geometry();
 double devicePixelRatio = QGuiApplication::primaryScreen()->devicePixelRatio();
 int screenW = screenRect.width();
 int screenH = screenRect.height();

首先从一个奇怪现象说起,上面的代码用来获取设备分辨率,但笔者在Qt Desktop和Qt for Android中分别测试时,却得到不一样的结果。在测试桌面程序时,获取到的屏幕分辨率和电脑显示器设置的分辨率完全一致,都是1920x1080。而当我用同样的代码在我同样分辨率的手机上测试时,却得到了698x393这样的结果。于是猜测通过上述代码,Qt for Android在移动设备上获取的屏幕宽高的单位并不是像素,很可能是一个与像素无关的单位(我把它叫做设备无关像素值,网上也有这样的叫法),而且在相同分辨率的不同手机上,获取的值可能不同,它和手机像素密度有关。

DPI计算方法

两个关键API:

  • QGuiApplication::primaryScreen()->physicalSize()
    手机屏幕物理尺寸获取,单位:毫米。
  • QGuiApplication::primaryScreen()->devicePixelRatio()
    设备无关像素值与像素的单位比值。
    上述两个API方法,读者可以查阅Qt官方文档详细了解。
  • 计算公式
    DPI=像素宽度 / 英寸宽度
    废话不多说,直接上代码,原理请看注释。
int Engine::getScreenDPI()
{
    QRect screenRect = QGuiApplication::primaryScreen()->geometry();
    double devicePixelRatio = QGuiApplication::primaryScreen()->devicePixelRatio();//设备无关像素值与像素的单位比值
   
 int screenW = screenRect.width();//设备无关像素值宽度。在手机设备上,这里得到的是设备无关像素值(如:在1080x1920像素分辨率的手机上,这里得到的宽高可能类似于393x698这样的设备无关像素值,宽度为393)
    int screenH = screenRect.height();//设备无关像素值高度
    qDebug()<<__LINE__<<__FUNCTION__<<"screenW = "<<screenW;
    qDebug()<<__LINE__<<__FUNCTION__<<"screenH = "<<screenH;

    int screenResolutionWidth =  int(screenW*devicePixelRatio);//手机屏幕真正的像素分辨率宽度
    QSizeF physicalSize = QGuiApplication::primaryScreen()->physicalSize();//手机屏幕物理尺寸,单位:毫米
    double physicalScreenWidthInch = double(physicalSize.width())/10*0.3937008;//手机屏幕英寸宽度
    int dpi =  int(screenResolutionWidth/physicalScreenWidthInch);//像素宽度除以英寸宽度=像素密度
    qDebug()<<__LINE__<<__FUNCTION__<<"devicePixelRatio = "<<devicePixelRatio;
    qDebug()<<__LINE__<<__FUNCTION__<<"QGuiApplication::physicalSize() = "<<QGuiApplication::primaryScreen()->physicalSize();
    qDebug()<<__LINE__<<__FUNCTION__<<"dpi = "<<dpi;
    return dpi;
}

相关文章

网友评论

      本文标题:Qt for Android屏幕DPI计算方法

      本文链接:https://www.haomeiwen.com/subject/wxltvqtx.html