From f43195a8927e2686007dc5e065a46272b2291abe Mon Sep 17 00:00:00 2001 From: Fan PengCheng Date: Mon, 26 Apr 2021 11:28:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=A5=E5=8E=86?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E6=95=B0=E5=AD=97=E6=98=BE=E7=A4=BA=E6=9C=89?= =?UTF-8?q?=E5=81=8F=E7=A7=BB=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在高分屏开1.5倍缩放,日历图片上的数字有偏移 Log: 修复日历图标数字显示有偏移的问题 Bug: https://pms.uniontech.com/zentao/bug-view-33865.html Change-Id: Ief4589cbc713c98ee503f414cce9ef5793dccad5 --- frame/item/appitem.cpp | 4 +- frame/item/launcheritem.cpp | 4 +- frame/util/imageutil.h | 3 +- frame/util/themeappicon.cpp | 72 ++++++++++++---------------------- frame/util/themeappicon.h | 2 +- plugins/tray/snitraywidget.cpp | 2 +- tests/util/ut_themeappicon.cpp | 8 ++-- 7 files changed, 37 insertions(+), 58 deletions(-) diff --git a/frame/item/appitem.cpp b/frame/item/appitem.cpp index 950d1389a..8c7de56de 100644 --- a/frame/item/appitem.cpp +++ b/frame/item/appitem.cpp @@ -601,9 +601,9 @@ void AppItem::refreshIcon() const int iconSize = qMin(width(), height()); if (DockDisplayMode == Efficient) - m_iconValid = ThemeAppIcon::getIcon(m_appIcon, icon, iconSize * 0.7, devicePixelRatioF(), !m_iconValid); + m_iconValid = ThemeAppIcon::getIcon(m_appIcon, icon, iconSize * 0.7, !m_iconValid); else - m_iconValid = ThemeAppIcon::getIcon(m_appIcon, icon, iconSize * 0.8, devicePixelRatioF(), !m_iconValid); + m_iconValid = ThemeAppIcon::getIcon(m_appIcon, icon, iconSize * 0.8, !m_iconValid); if (!m_refershIconTimer->isActive() && m_itemEntryInter->icon() == "dde-calendar") { m_refershIconTimer->start(); diff --git a/frame/item/launcheritem.cpp b/frame/item/launcheritem.cpp index e4cdfedab..eed4ebfba 100644 --- a/frame/item/launcheritem.cpp +++ b/frame/item/launcheritem.cpp @@ -52,9 +52,9 @@ void LauncherItem::refreshIcon() { const int iconSize = qMin(width(), height()); if (DockDisplayMode == Efficient) { - ThemeAppIcon::getIcon(m_icon, "deepin-launcher", iconSize * 0.7, devicePixelRatioF()); + ThemeAppIcon::getIcon(m_icon, "deepin-launcher", iconSize * 0.7); } else { - ThemeAppIcon::getIcon(m_icon, "deepin-launcher", iconSize * 0.8, devicePixelRatioF()); + ThemeAppIcon::getIcon(m_icon, "deepin-launcher", iconSize * 0.8); } update(); diff --git a/frame/util/imageutil.h b/frame/util/imageutil.h index e357d6983..f58ff6fba 100644 --- a/frame/util/imageutil.h +++ b/frame/util/imageutil.h @@ -25,12 +25,13 @@ #include #include #include +#include class ImageUtil { public: static const QPixmap loadSvg(const QString &iconName, const QString &localPath, const int size, const qreal ratio); - static const QPixmap loadSvg(const QString &iconName, const QSize size, const qreal ratio); + static const QPixmap loadSvg(const QString &iconName, const QSize size, const qreal ratio = qApp->devicePixelRatio()); }; #endif // IMAGEUTIL_H diff --git a/frame/util/themeappicon.cpp b/frame/util/themeappicon.cpp index 325d9cb1b..88eb8b3a4 100644 --- a/frame/util/themeappicon.cpp +++ b/frame/util/themeappicon.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -68,66 +69,43 @@ QIcon ThemeAppIcon::getIcon(const QString &name) return icon; } -bool ThemeAppIcon::getIcon(QPixmap &pix, const QString iconName, const int size, const qreal ratio, bool reObtain) +bool ThemeAppIcon::getIcon(QPixmap &pix, const QString iconName, const int size, bool reObtain) { QString key; QIcon icon; bool ret = true; // 把size改为小于size的最大偶数 :) - const int s = int(size * ratio) & ~1; - const float iconZoom = size / 64.0 * 0.8; + const int s = int(size * qApp->devicePixelRatio()) & ~1; if (iconName == "dde-calendar") { + const double iconZoom = s / 256.0; QDate const date(QDate::currentDate()); - auto calendar = new QWidget() ; - calendar->setFixedSize(s, s); + QPixmap pixmap(":/indicator/resources/calendar_bg.svg"); + pixmap = pixmap.scaled(s, s, Qt::KeepAspectRatio, Qt::SmoothTransformation); - calendar->setAutoFillBackground(true); - QPalette palette = calendar->palette(); - palette.setBrush(QPalette::Window, - QBrush(QPixmap(":/indicator/resources/calendar_bg.svg").scaled( - calendar->size(), - Qt::IgnoreAspectRatio, - Qt::SmoothTransformation))); - calendar->setPalette(palette); + QPainter painter(&pixmap); + painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform); - QVBoxLayout *layout = new QVBoxLayout; - layout->setSpacing(0); - auto month = new QLabel(); - auto monthPix = ImageUtil::loadSvg(QString(":/icons/resources/month%1.svg").arg(date.month()), QSize(36, 16)*iconZoom, ratio); - month->setPixmap(monthPix.scaled(monthPix.width()*ratio,monthPix.height()*ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation)); - month->setFixedHeight(month->pixmap()->height()); - month->setAlignment(Qt::AlignCenter); - month->setFixedWidth(s - 5 * iconZoom); - layout->addWidget(month, Qt::AlignVCenter); + //根据不同日期显示不同日历图表 + int tw = pixmap.rect().width(); + int th = pixmap.rect().height(); + int tx = pixmap.rect().x(); + int ty = pixmap.rect().y(); - auto day = new QLabel(); - auto dayPix =ImageUtil::loadSvg(QString(":/icons/resources/day%1.svg").arg(date.day()), QSize(32, 30)*iconZoom, ratio); - day->setPixmap(dayPix.scaled(dayPix.width()*ratio,dayPix.height()*ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation)); - day->setAlignment(Qt::AlignCenter); - day->setFixedHeight(day->pixmap()->height()/ratio); - day->raise(); - layout->addWidget(day, Qt::AlignVCenter); + //绘制月份 + QRectF rcMonth(tx + (tw / 3.4), ty + (th / 5.4), 80 * iconZoom, 40 * iconZoom); + painter.drawPixmap(rcMonth.topLeft(), ImageUtil::loadSvg(QString(":/icons/resources/month%1.svg").arg(date.month()), rcMonth.size().toSize())); + //绘制日 + QRectF rcDay(tx + (tw / 3.5), ty + th / 3.1, 112 * iconZoom, 104 * iconZoom); + painter.drawPixmap(rcDay.topLeft(), ImageUtil::loadSvg(QString(":/icons/resources/day%1.svg").arg(date.day()), rcDay.size().toSize())); + //绘制周 + QRectF rcWeek(tx + (tw / 2.3), ty + ((th / 3.9) * 2.8), 56 * iconZoom, 24 * iconZoom); + painter.drawPixmap(rcWeek.topLeft(), ImageUtil::loadSvg(QString(":/icons/resources/week%1.svg").arg(date.dayOfWeek()), rcWeek.size().toSize())); - auto week = new QLabel(); - auto weekPix = ImageUtil::loadSvg(QString(":/icons/resources/week%1.svg").arg(date.dayOfWeek()), QSize(26, 13)*iconZoom, ratio); - week->setPixmap(weekPix.scaled(weekPix.width()*ratio,weekPix.height()*ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation)); - week->setFixedHeight(week->pixmap()->height()); - week->setAlignment(Qt::AlignCenter); - week->setFixedWidth(s + 5 * iconZoom); - layout->addWidget(week, Qt::AlignVCenter); - layout->setSpacing(0); - layout->setContentsMargins(0, 10 * iconZoom, 0, 10 * iconZoom); - calendar->setLayout(layout); - pix = calendar->grab(calendar->rect()); + pix = pixmap; + pix.setDevicePixelRatio(qApp->devicePixelRatio()); - delete calendar; - calendar = nullptr; - - if (pix.size().width() != s) { - pix = pix.scaled(s, s, Qt::KeepAspectRatio, Qt::SmoothTransformation); - } return ret; } @@ -194,7 +172,7 @@ bool ThemeAppIcon::getIcon(QPixmap &pix, const QString iconName, const int size, if (pix.size().width() != s) { pix = pix.scaled(s, s, Qt::KeepAspectRatio, Qt::SmoothTransformation); } - pix.setDevicePixelRatio(ratio); + pix.setDevicePixelRatio(qApp->devicePixelRatio()); return ret; } diff --git a/frame/util/themeappicon.h b/frame/util/themeappicon.h index 338509cc2..c8a472c8b 100644 --- a/frame/util/themeappicon.h +++ b/frame/util/themeappicon.h @@ -32,7 +32,7 @@ public: ~ThemeAppIcon(); static QIcon getIcon(const QString &name); - static bool getIcon(QPixmap &pix, const QString iconName, const int size, const qreal ratio, bool reObtain = false); + static bool getIcon(QPixmap &pix, const QString iconName, const int size, bool reObtain = false); }; #endif // THEMEAPPICON_H diff --git a/plugins/tray/snitraywidget.cpp b/plugins/tray/snitraywidget.cpp index dcaa3fe96..b5251945d 100644 --- a/plugins/tray/snitraywidget.cpp +++ b/plugins/tray/snitraywidget.cpp @@ -542,7 +542,7 @@ QPixmap SNITrayWidget::newIconPixmap(IconType iconType) // so, it should be the last fallback if (!iconName.isEmpty()) { // ThemeAppIcon::getIcon 会处理高分屏缩放问题 - ThemeAppIcon::getIcon(pixmap, iconName, IconSize, devicePixelRatioF()); + ThemeAppIcon::getIcon(pixmap, iconName, IconSize); if (!pixmap.isNull()) { break; } diff --git a/tests/util/ut_themeappicon.cpp b/tests/util/ut_themeappicon.cpp index f17ccc8a1..00f20868c 100644 --- a/tests/util/ut_themeappicon.cpp +++ b/tests/util/ut_themeappicon.cpp @@ -45,17 +45,17 @@ TEST_F(Ut_ThemeAppIcon, getIcon_test) { ThemeAppIcon appIcon; QPixmap pix1; - appIcon.getIcon(pix1, "", 50, 1.0); + appIcon.getIcon(pix1, "", 50); ASSERT_FALSE(pix1.isNull()); QPixmap pix; - appIcon.getIcon(pix, "dde-calendar", 50, 1.0); + appIcon.getIcon(pix, "dde-calendar", 50); QPixmap pix2; - appIcon.getIcon(pix2, "data:image/test", 50, 1.0); + appIcon.getIcon(pix2, "data:image/test", 50); ASSERT_FALSE(pix2.isNull()); QPixmap pix3; - appIcon.getIcon(pix3, ":/res/all_settings_on.png", 50, 1.0); + appIcon.getIcon(pix3, ":/res/all_settings_on.png", 50); ASSERT_FALSE(pix3.isNull()); }