fix: 修复日历图标数字显示有偏移的问题

在高分屏开1.5倍缩放,日历图片上的数字有偏移

Log: 修复日历图标数字显示有偏移的问题
Bug: https://pms.uniontech.com/zentao/bug-view-33865.html
Change-Id: Ief4589cbc713c98ee503f414cce9ef5793dccad5
This commit is contained in:
Fan PengCheng 2021-04-26 11:28:47 +08:00
parent c607c4b00f
commit f43195a892
7 changed files with 37 additions and 58 deletions

View File

@ -601,9 +601,9 @@ void AppItem::refreshIcon()
const int iconSize = qMin(width(), height()); const int iconSize = qMin(width(), height());
if (DockDisplayMode == Efficient) 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 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") { if (!m_refershIconTimer->isActive() && m_itemEntryInter->icon() == "dde-calendar") {
m_refershIconTimer->start(); m_refershIconTimer->start();

View File

@ -52,9 +52,9 @@ void LauncherItem::refreshIcon()
{ {
const int iconSize = qMin(width(), height()); const int iconSize = qMin(width(), height());
if (DockDisplayMode == Efficient) { if (DockDisplayMode == Efficient) {
ThemeAppIcon::getIcon(m_icon, "deepin-launcher", iconSize * 0.7, devicePixelRatioF()); ThemeAppIcon::getIcon(m_icon, "deepin-launcher", iconSize * 0.7);
} else { } else {
ThemeAppIcon::getIcon(m_icon, "deepin-launcher", iconSize * 0.8, devicePixelRatioF()); ThemeAppIcon::getIcon(m_icon, "deepin-launcher", iconSize * 0.8);
} }
update(); update();

View File

@ -25,12 +25,13 @@
#include <QWidget> #include <QWidget>
#include <QPixmap> #include <QPixmap>
#include <QSvgRenderer> #include <QSvgRenderer>
#include <QApplication>
class ImageUtil class ImageUtil
{ {
public: 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 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 #endif // IMAGEUTIL_H

View File

@ -31,6 +31,7 @@
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QLabel> #include <QLabel>
#include <QDate> #include <QDate>
#include <QPainter>
#include <private/qguiapplication_p.h> #include <private/qguiapplication_p.h>
#include <private/qiconloader_p.h> #include <private/qiconloader_p.h>
@ -68,66 +69,43 @@ QIcon ThemeAppIcon::getIcon(const QString &name)
return icon; 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; QString key;
QIcon icon; QIcon icon;
bool ret = true; bool ret = true;
// 把size改为小于size的最大偶数 :) // 把size改为小于size的最大偶数 :)
const int s = int(size * ratio) & ~1; const int s = int(size * qApp->devicePixelRatio()) & ~1;
const float iconZoom = size / 64.0 * 0.8;
if (iconName == "dde-calendar") { if (iconName == "dde-calendar") {
const double iconZoom = s / 256.0;
QDate const date(QDate::currentDate()); QDate const date(QDate::currentDate());
auto calendar = new QWidget() ; QPixmap pixmap(":/indicator/resources/calendar_bg.svg");
calendar->setFixedSize(s, s); pixmap = pixmap.scaled(s, s, Qt::KeepAspectRatio, Qt::SmoothTransformation);
calendar->setAutoFillBackground(true); QPainter painter(&pixmap);
QPalette palette = calendar->palette(); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform);
palette.setBrush(QPalette::Window,
QBrush(QPixmap(":/indicator/resources/calendar_bg.svg").scaled(
calendar->size(),
Qt::IgnoreAspectRatio,
Qt::SmoothTransformation)));
calendar->setPalette(palette);
QVBoxLayout *layout = new QVBoxLayout; //根据不同日期显示不同日历图表
layout->setSpacing(0); int tw = pixmap.rect().width();
auto month = new QLabel(); int th = pixmap.rect().height();
auto monthPix = ImageUtil::loadSvg(QString(":/icons/resources/month%1.svg").arg(date.month()), QSize(36, 16)*iconZoom, ratio); int tx = pixmap.rect().x();
month->setPixmap(monthPix.scaled(monthPix.width()*ratio,monthPix.height()*ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation)); int ty = pixmap.rect().y();
month->setFixedHeight(month->pixmap()->height());
month->setAlignment(Qt::AlignCenter);
month->setFixedWidth(s - 5 * iconZoom);
layout->addWidget(month, Qt::AlignVCenter);
auto day = new QLabel(); //绘制月份
auto dayPix =ImageUtil::loadSvg(QString(":/icons/resources/day%1.svg").arg(date.day()), QSize(32, 30)*iconZoom, ratio); QRectF rcMonth(tx + (tw / 3.4), ty + (th / 5.4), 80 * iconZoom, 40 * iconZoom);
day->setPixmap(dayPix.scaled(dayPix.width()*ratio,dayPix.height()*ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation)); painter.drawPixmap(rcMonth.topLeft(), ImageUtil::loadSvg(QString(":/icons/resources/month%1.svg").arg(date.month()), rcMonth.size().toSize()));
day->setAlignment(Qt::AlignCenter); //绘制日
day->setFixedHeight(day->pixmap()->height()/ratio); QRectF rcDay(tx + (tw / 3.5), ty + th / 3.1, 112 * iconZoom, 104 * iconZoom);
day->raise(); painter.drawPixmap(rcDay.topLeft(), ImageUtil::loadSvg(QString(":/icons/resources/day%1.svg").arg(date.day()), rcDay.size().toSize()));
layout->addWidget(day, Qt::AlignVCenter); //绘制周
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(); pix = pixmap;
auto weekPix = ImageUtil::loadSvg(QString(":/icons/resources/week%1.svg").arg(date.dayOfWeek()), QSize(26, 13)*iconZoom, ratio); pix.setDevicePixelRatio(qApp->devicePixelRatio());
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());
delete calendar;
calendar = nullptr;
if (pix.size().width() != s) {
pix = pix.scaled(s, s, Qt::KeepAspectRatio, Qt::SmoothTransformation);
}
return ret; return ret;
} }
@ -194,7 +172,7 @@ bool ThemeAppIcon::getIcon(QPixmap &pix, const QString iconName, const int size,
if (pix.size().width() != s) { if (pix.size().width() != s) {
pix = pix.scaled(s, s, Qt::KeepAspectRatio, Qt::SmoothTransformation); pix = pix.scaled(s, s, Qt::KeepAspectRatio, Qt::SmoothTransformation);
} }
pix.setDevicePixelRatio(ratio); pix.setDevicePixelRatio(qApp->devicePixelRatio());
return ret; return ret;
} }

View File

@ -32,7 +32,7 @@ public:
~ThemeAppIcon(); ~ThemeAppIcon();
static QIcon getIcon(const QString &name); 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 #endif // THEMEAPPICON_H

View File

@ -542,7 +542,7 @@ QPixmap SNITrayWidget::newIconPixmap(IconType iconType)
// so, it should be the last fallback // so, it should be the last fallback
if (!iconName.isEmpty()) { if (!iconName.isEmpty()) {
// ThemeAppIcon::getIcon 会处理高分屏缩放问题 // ThemeAppIcon::getIcon 会处理高分屏缩放问题
ThemeAppIcon::getIcon(pixmap, iconName, IconSize, devicePixelRatioF()); ThemeAppIcon::getIcon(pixmap, iconName, IconSize);
if (!pixmap.isNull()) { if (!pixmap.isNull()) {
break; break;
} }

View File

@ -45,17 +45,17 @@ TEST_F(Ut_ThemeAppIcon, getIcon_test)
{ {
ThemeAppIcon appIcon; ThemeAppIcon appIcon;
QPixmap pix1; QPixmap pix1;
appIcon.getIcon(pix1, "", 50, 1.0); appIcon.getIcon(pix1, "", 50);
ASSERT_FALSE(pix1.isNull()); ASSERT_FALSE(pix1.isNull());
QPixmap pix; QPixmap pix;
appIcon.getIcon(pix, "dde-calendar", 50, 1.0); appIcon.getIcon(pix, "dde-calendar", 50);
QPixmap pix2; QPixmap pix2;
appIcon.getIcon(pix2, "data:image/test", 50, 1.0); appIcon.getIcon(pix2, "data:image/test", 50);
ASSERT_FALSE(pix2.isNull()); ASSERT_FALSE(pix2.isNull());
QPixmap pix3; 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()); ASSERT_FALSE(pix3.isNull());
} }