qt编写的android菜单,Qt for Android屏幕DPI计算方法

关于手机屏幕像素密度(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__>

qDebug()<<__line__>

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__>

qDebug()<<__line__>physicalSize();

qDebug()<<__line__>

return dpi;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值