QT自适应屏幕分辨率,适用android – 神奇代码串

您所在的位置:网站首页 修改apk分辨率尺寸 QT自适应屏幕分辨率,适用android – 神奇代码串

QT自适应屏幕分辨率,适用android – 神奇代码串

2024-07-12 19:54:15| 来源: 网络整理| 查看: 265

QT自适应屏幕分辨率,适用android

未分类 / 2021年11月12日 / 蓝枫 / 0

使用QT开发Android应用程序需要适应不同的移动设备以及各种屏幕和分辨率。以下,我们讨论如何使用QT提供的机制来创建一个可缩放的接口。

DPI

DPI,即每英寸点数(或PPI,即每英寸的像素数)。该值越高,像素密度越高,小屏幕可以具有较大的分辨率。例如,一些安卓手机的3.7英寸屏幕可以提供960×540的分辨率,而其他手机的5英寸屏幕可以提供800×480的分辨率。对于这两款屏幕大小和分辨率不同的手机,5英寸的屏幕看起来很粗糙,而3.7英寸的屏幕看起来非常精致。这就是像素密度的差异。具有相同分辨率(像素)的图片在DPI较大的屏幕上看起来更小。

三类可伸缩元素:

文字图片背景

文字:

对于文字,我们只需要设置特定文本显示和输入控件使用的字体(QFont)的pointSize。Qlabel、QPushButton、qlineedit等都适用于此方法。

Qfont大小可以用两种方式表示:pixelSize 和 pointSize。pointsize将根据应用程序所在设备的DPI调整字体,使其在具有不同DPI的设备上看起来相同。

在QT中,Widget使用的字体可以单独更改,或者可以通过QApplication提供全局字体,以便那些没有特殊设置的 Widget 将使用全局字体。

图片:

如前所述,同一分辨率图像的DPI越大,人眼看到的图像就越小。

以 QPixmap 为例来说明,QPixmap 有两个方法:

void  setDevicePixelRatio(qreal scaleFactor)qreal QPixmap::devicePixelRatio() const

这两个方法操作一个叫作 device pixel ratio 的属性,该属性指定设备相关像素和设备无关像素之间的转换比率。我们可以调整图片在手机屏幕上的效果。

Qimage类也有这两种方法。可以参考QT帮助以查看API的详细信息。

如何获取设备的 devicePixelRation 呢?

qreal QScreen::​devicePixelRatio() const 可以返回这个值

QGuiApplication 、 QWindow 这两个类也有同样的方法。

下面是使用 QScreen 的 logicalDotsPerInch() 方法结合一个常见的 DPI (比如 72)来计算的示例代码:

float SizeUtil::dpiFactor() { QScreen *screen = qApp->primaryScreen(); return 72 / screen->logicalDotsPerInch(); }

我在下面的示例中使用了上述方法。

应该注意的是,当QT的内置控件使用qpixmap和qimage时,会结合 devicePixelRation 来决定这个控件的大小,在我们的示例中,qlabel用于显示图片。

背景:

背景可以是颜色,也可以是图片。当使用图片作为背景时,我们面临拉伸的问题。Android使用9patch图像来解决这个问题,QT也提供了类似的功能:边框图像。

在基于QT Widgets的应用程序中,我们可以通过QSS设置border-image来构建可伸缩的背景。

上图在QT帮助中。四行将一幅画剪成九份。使用时,四个角可以保持不变,其他部分可以通过拉伸或平铺来适应接口空间的大小。

我们来看一个简单的例子。

可伸缩界面示例:

效果图

手机上的效果,没有设置 devicePixelRatio

未设置devicepixelratio的图片看起来小得多。将其与文本进行比较,可以看出比例失衡。

下图是设置了 devicePixelRatio 的效果,看起来一致了。

代码分析

基于QT Widgets创建了一个名为scalabeUI的应用程序,并创建了两个文件sizeUtil.h 和 sizeUtil.cpp。

项目中使用了两种图像资源:

图片我加到了 qrc 里。

sizeUtil.h 如下:

#ifndef SIZEUTIL_H #define SIZEUTIL_H #include #include class SizeUtil { private: SizeUtil(){} SizeUtil(const SizeUtil &); SizeUtil & operator=(const SizeUtil&); public: ~SizeUtil(){} static SizeUtil & instance(); int defaultFontHeight(); int widthWithDefaultFont(const QString &text); int widthWithFont(const QString &text, int fontPointSize); int fontHeight(int fontPointSize); float dpiFactor(); }; #endif // SIZEUTIL_H

sizeUtil.cpp 如下:

#include "sizeUtil.h" #include #include #include SizeUtil & SizeUtil::instance() { static SizeUtil util; return util; } int SizeUtil::defaultFontHeight() { return qApp->fontMetrics().height(); } int SizeUtil::widthWithDefaultFont(const QString &text) { return qApp->fontMetrics().boundingRect(text).width(); } int SizeUtil::widthWithFont(const QString &text, int fontPointSize) { QFont f = qApp->font(); f.setPointSize(fontPointSize); QFontMetrics fm(f); return fm.boundingRect(text).width(); } int SizeUtil::fontHeight(int fontPointSize) { QFont f = qApp->font(); f.setPointSize(fontPointSize); QFontMetrics fm(f); return fm.height(); } float SizeUtil::dpiFactor() { QScreen *screen = qApp->primaryScreen(); return 72 / screen->logicalDotsPerInch(); }

SizeUtil 类主要是用来计算文本的像素大小。

    新建项目向导给我们生成了 widget.cpp 和 widget.h ,我修改了一下 widget.cpp ,针对文字、图片、背景三种情况,做了处理。代码如下:

#include "widget.h" #include #include #include #include #include "sizeUtil.h" Widget::Widget(QWidget *parent) : QWidget(parent) { QVBoxLayout *layout = new QVBoxLayout(this); //case 1. background QLabel *label = new QLabel("Hello Scalable Label"); layout->addWidget(label, 1); /* top right bottom left */ label->setStyleSheet( "QLabel{border-image:url(:/bkgnd.9.png) 38 6 6 16;" " border-left-width: 16; border-top-width: 38;" " border-right-width: 6; border-bottom-width: 6}"); //case 2. image QLabel *head = new QLabel; QPixmap orig(":/head.png"); orig.setDevicePixelRatio(SizeUtil::instance().dpiFactor()); head->setPixmap(orig); layout->addWidget(head); //case 3. text button QHBoxLayout *hlayout = new QHBoxLayout; layout->addLayout(hlayout); QPushButton *button = new QPushButton("Text Button"); hlayout->addWidget(button); hlayout->addStretch(1); } Widget::~Widget() { }

这就是代码的全部了,虽然简单,基本可以说明问题了。

蓝枫



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭