關(guān)于手機(jī)屏幕像素密度(DPI)篙议,網(wǎng)絡(luò)上有許多相關(guān)介紹夫啊,但真正能夠在Qt for Android開(kāi)發(fā)中成功使用的方法券膀,我沒(méi)有找到過(guò)。經(jīng)過(guò)一番調(diào)研奸鬓,我得出本文介紹的方法,并在多個(gè)Android手機(jī)上測(cè)試通過(guò)掸读,現(xiàn)分享給大家串远。
獲得設(shè)備像素密度值有何作用
可以根據(jù)像素密度值選擇不同的UI資源文件,達(dá)到讓?xiě)?yīng)用程序適配不同屏幕大小的目的儿惫,而不會(huì)因?yàn)槠聊坏南袼仡w粒大小的不同澡罚,而影響正常顯示。
一個(gè)奇怪現(xiàn)象
QRect screenRect = QGuiApplication::primaryScreen()->geometry();
double devicePixelRatio = QGuiApplication::primaryScreen()->devicePixelRatio();
int screenW = screenRect.width();
int screenH = screenRect.height();
首先從一個(gè)奇怪現(xiàn)象說(shuō)起肾请,上面的代碼用來(lái)獲取設(shè)備分辨率留搔,但筆者在Qt Desktop和Qt for Android中分別測(cè)試時(shí),卻得到不一樣的結(jié)果筐喳。在測(cè)試桌面程序時(shí)催式,獲取到的屏幕分辨率和電腦顯示器設(shè)置的分辨率完全一致函喉,都是1920x1080。而當(dāng)我用同樣的代碼在我同樣分辨率的手機(jī)上測(cè)試時(shí)荣月,卻得到了698x393這樣的結(jié)果管呵。于是猜測(cè)通過(guò)上述代碼,Qt for Android在移動(dòng)設(shè)備上獲取的屏幕寬高的單位并不是像素哺窄,很可能是一個(gè)與像素?zé)o關(guān)的單位(我把它叫做設(shè)備無(wú)關(guān)像素值捐下,網(wǎng)上也有這樣的叫法),而且在相同分辨率的不同手機(jī)上萌业,獲取的值可能不同坷襟,它和手機(jī)像素密度有關(guān)。
DPI計(jì)算方法
兩個(gè)關(guān)鍵API:
- QGuiApplication::primaryScreen()->physicalSize()
手機(jī)屏幕物理尺寸獲取生年,單位:毫米婴程。 - QGuiApplication::primaryScreen()->devicePixelRatio()
設(shè)備無(wú)關(guān)像素值與像素的單位比值。
上述兩個(gè)API方法抱婉,讀者可以查閱Qt官方文檔詳細(xì)了解档叔。 - 計(jì)算公式
DPI=像素寬度 / 英寸寬度
廢話不多說(shuō),直接上代碼蒸绩,原理請(qǐng)看注釋衙四。
int Engine::getScreenDPI()
{
QRect screenRect = QGuiApplication::primaryScreen()->geometry();
double devicePixelRatio = QGuiApplication::primaryScreen()->devicePixelRatio();//設(shè)備無(wú)關(guān)像素值與像素的單位比值
int screenW = screenRect.width();//設(shè)備無(wú)關(guān)像素值寬度。在手機(jī)設(shè)備上患亿,這里得到的是設(shè)備無(wú)關(guān)像素值(如:在1080x1920像素分辨率的手機(jī)上传蹈,這里得到的寬高可能類(lèi)似于393x698這樣的設(shè)備無(wú)關(guān)像素值,寬度為393)
int screenH = screenRect.height();//設(shè)備無(wú)關(guān)像素值高度
qDebug()<<__LINE__<<__FUNCTION__<<"screenW = "<<screenW;
qDebug()<<__LINE__<<__FUNCTION__<<"screenH = "<<screenH;
int screenResolutionWidth = int(screenW*devicePixelRatio);//手機(jī)屏幕真正的像素分辨率寬度
QSizeF physicalSize = QGuiApplication::primaryScreen()->physicalSize();//手機(jī)屏幕物理尺寸步藕,單位:毫米
double physicalScreenWidthInch = double(physicalSize.width())/10*0.3937008;//手機(jī)屏幕英寸寬度
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;
}