QT自适应屏幕分辨率,适用android – 神奇代码串 |
您所在的位置:网站首页 › 修改apk分辨率尺寸 › QT自适应屏幕分辨率,适用android – 神奇代码串 |
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_HsizeUtil.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() { }这就是代码的全部了,虽然简单,基本可以说明问题了。 蓝枫 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |