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());
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();

View File

@ -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();

View File

@ -25,12 +25,13 @@
#include <QWidget>
#include <QPixmap>
#include <QSvgRenderer>
#include <QApplication>
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

View File

@ -31,6 +31,7 @@
#include <QHBoxLayout>
#include <QLabel>
#include <QDate>
#include <QPainter>
#include <private/qguiapplication_p.h>
#include <private/qiconloader_p.h>
@ -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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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());
}