Qt for Android中不同大小屏幕的适配方法

在阅读本文之前,读者可以先了解一下我之前发布的一篇有关像素密度计算的文章《Qt for Android屏幕DPI计算方法》。
在前面的文章中描述了计算手机DPI的方法,这里需要提醒大家的是,即使通过设备的像素密度值,选取了正确的图片资源文件夹,在QML移动开发中,也还是需要对图片大小做一个换算处理。请看下面代码片段:

import QtQuick 2.12
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.12
import QtQuick.Controls.Styles 1.4
import QtQuick.Window 2.2
...
Image {
        id: backgoundImage
        anchors.fill: parent
        width: sourceSize.width/Screen.devicePixelRatio
        height: sourceSize.height/Screen.devicePixelRatio
        source: "qrc:/img-res/"+appEngine.resourceFolder()+"/signin_bg.png"

    }
...
  • sourceSize.width得到的是图片的像素宽度,用它除以设备像素比值(请看我前面发表的文章),得到设备无关像素值。为什么需要这样做呢?在QML for Android开发中,对象的宽度和高度的单位不是像素,而是设备无关像素值(强调:这里指移动开发,而不是桌面开发)。可以这样证明:在1080x1920像素分辨率的手机上,如果读者在QML代码中创建一个矩形或者图片对象,并把它的宽高分别设置为1080和1920,可以发现这个矩形或者图片的右边和下边,远远的显示到了屏幕的外面,而通过下面代码得到的宽高,才是真正刚好铺满屏幕的宽高,这个宽高是与设备无关的:
QRect screenRect = QGuiApplication::primaryScreen()->geometry();
int screenW = screenRect.width();
int screenH = screenRect.height();
  • appEngine.resourceFolder()
    这是从C++代码中获取的图片资源文件夹名称,把它拼接在QML代码中的图片资源路径中,它是通过DPI而决定的,请看下面代码:
void Engine::uiInit()
{
    int dpi = this->getScreenDPI();
    qDebug()<<__LINE__<<__FUNCTION__<<"this->getScreenDPI() = "<<dpi;

    if(80 <= dpi && dpi < 120)
        m_resourceFolder = "ldpi";
    else if(120 <= dpi && dpi < 160)
        m_resourceFolder = "mdpi";
    else if(160 <= dpi && dpi < 240)
        m_resourceFolder = "hdpi";
    else if(240 <= dpi && dpi < 320)
        m_resourceFolder = "xhdpi";
    else if(320 <= dpi && dpi < 480)
        m_resourceFolder = "xxhdpi";
    else if(480 <= dpi && dpi < 640)
        m_resourceFolder = "xxxhdpi";
    qDebug()<<__LINE__<<__FUNCTION__<<"m_resourceFolder = "<<m_resourceFolder;
}
QString Engine::resourceFolder()
{
    return m_resourceFolder;
}
  • 不同DPI设备的图片资源保存方法


    image.png

    image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容