关于手机屏幕像素密度(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;
}
网友评论