refactor: use QWidget::devicePixelRatio to replace QApplication::devicePixelRatio

插入新屏幕后,新屏幕的缩放是1,切换为复制模式后如果继续使用QApplication::devicePixelRatio会导致
显示错误,统一换成QWidget::devicePixelRatio或QScreen::devicePixelRatio。
This commit is contained in:
justforlxz 2019-04-23 14:28:09 +08:00
parent 4be6ba571c
commit 55c4c74a82
No known key found for this signature in database
GPG Key ID: 593AFD577C1B1A60
20 changed files with 82 additions and 65 deletions

View File

@ -511,7 +511,7 @@ bool AppItem::hasAttention() const
QPoint AppItem::appIconPosition() const
{
const auto ratio = qApp->devicePixelRatio();
const auto ratio = devicePixelRatioF();
const QRectF itemRect = rect();
const QRectF iconRect = m_appIcon.rect();
const qreal iconX = itemRect.center().x() - iconRect.center().x() / ratio;
@ -547,9 +547,9 @@ void AppItem::refershIcon()
const int iconSize = qMin(width(), height());
if (DockDisplayMode == Efficient)
m_appIcon = ThemeAppIcon::getIcon(icon, iconSize * 0.7);
m_appIcon = ThemeAppIcon::getIcon(icon, iconSize * 0.7, devicePixelRatioF());
else
m_appIcon = ThemeAppIcon::getIcon(icon, iconSize * 0.8);
m_appIcon = ThemeAppIcon::getIcon(icon, iconSize * 0.8, devicePixelRatioF());
if (m_appIcon.isNull()) {
if (m_retryTimes < 5) {
@ -602,7 +602,7 @@ void AppItem::playSwingEffect()
stopSwingEffect();
QPair<QGraphicsView *, QGraphicsItemAnimation *> pair = SwingEffect(
this, m_appIcon, rect(), qApp->devicePixelRatio());
this, m_appIcon, rect(), devicePixelRatioF());
m_swingEffectView = pair.first;
m_itemAnimation = pair.second;

View File

@ -48,11 +48,11 @@ void LauncherItem::refershIcon()
const int iconSize = qMin(width(), height());
if (DockDisplayMode == Efficient)
{
m_smallIcon = ThemeAppIcon::getIcon("deepin-launcher", iconSize * 0.7);
m_largeIcon = ThemeAppIcon::getIcon("deepin-launcher", iconSize * 0.9);
m_smallIcon = ThemeAppIcon::getIcon("deepin-launcher", iconSize * 0.7, devicePixelRatioF());
m_largeIcon = ThemeAppIcon::getIcon("deepin-launcher", iconSize * 0.9, devicePixelRatioF());
} else {
m_smallIcon = ThemeAppIcon::getIcon("deepin-launcher", iconSize * 0.6);
m_largeIcon = ThemeAppIcon::getIcon("deepin-launcher", iconSize * 0.8);
m_smallIcon = ThemeAppIcon::getIcon("deepin-launcher", iconSize * 0.6, devicePixelRatioF());
m_largeIcon = ThemeAppIcon::getIcon("deepin-launcher", iconSize * 0.8, devicePixelRatioF());
}
update();
@ -69,7 +69,7 @@ void LauncherItem::paintEvent(QPaintEvent *e)
const QPixmap pixmap = DockDisplayMode == Fashion ? m_largeIcon : m_smallIcon;
const auto ratio = qApp->devicePixelRatio();
const auto ratio = devicePixelRatioF();
const int iconX = rect().center().x() - pixmap.rect().center().x() / ratio;
const int iconY = rect().center().y() - pixmap.rect().center().y() / ratio;

View File

@ -22,6 +22,7 @@
#include "docksettings.h"
#include "panel/mainpanel.h"
#include "item/appitem.h"
#include "util/utils.h"
#include <QDebug>
#include <QX11Info>
@ -68,7 +69,7 @@ DockSettings::DockSettings(QWidget *parent)
m_hideMode = Dock::HideMode(m_dockInter->hideMode());
m_hideState = Dock::HideState(m_dockInter->hideState());
m_iconSize = m_dockInter->iconSize();
AppItem::setIconBaseSize(m_iconSize * qApp->devicePixelRatio());
AppItem::setIconBaseSize(m_iconSize * dockRatio());
DockItem::setDockPosition(m_position);
qApp->setProperty(PROP_POSITION, QVariant::fromValue(m_position));
DockItem::setDockDisplayMode(m_displayMode);
@ -364,7 +365,7 @@ void DockSettings::iconSizeChanged()
{
// qDebug() << Q_FUNC_INFO;
m_iconSize = m_dockInter->iconSize();
AppItem::setIconBaseSize(m_iconSize * qApp->devicePixelRatio());
AppItem::setIconBaseSize(m_iconSize * dockRatio());
calculateWindowConfig();
@ -432,7 +433,7 @@ void DockSettings::primaryScreenChanged()
void DockSettings::resetFrontendGeometry()
{
const QRect r = windowRect(m_position);
const qreal ratio = qApp->devicePixelRatio();
const qreal ratio = dockRatio();
const QPoint p = rawXPosition(r.topLeft());
const uint w = r.width() * ratio;
const uint h = r.height() * ratio;
@ -540,7 +541,7 @@ void DockSettings::onFashionTraySizeChanged(const QSize &traySize)
void DockSettings::calculateWindowConfig()
{
const auto ratio = qApp->devicePixelRatio();
const auto ratio = dockRatio();
const int defaultHeight = std::round(AppItem::itemBaseHeight() / ratio);
const int defaultWidth = std::round(AppItem::itemBaseWidth() / ratio);
@ -623,3 +624,10 @@ void DockSettings::gtkIconThemeChanged()
qDebug() << Q_FUNC_INFO;
m_itemController->refershItemsIcon();
}
qreal DockSettings::dockRatio() const
{
QScreen const *screen = Utils::screenAtByScaled(m_frontendRect.center());
return screen ? screen->devicePixelRatio() : qApp->devicePixelRatio();
}

View File

@ -80,6 +80,7 @@ public:
const QSize panelSize() const;
const QRect windowRect(const Position position, const bool hide = false) const;
qreal dockRatio() const;
void showDockSettingsMenu();

View File

@ -38,9 +38,8 @@ ThemeAppIcon::~ThemeAppIcon()
}
const QPixmap ThemeAppIcon::getIcon(const QString iconName, const int size)
const QPixmap ThemeAppIcon::getIcon(const QString iconName, const int size, const qreal ratio)
{
const auto ratio = qApp->devicePixelRatio();
QPixmap pixmap;
QString key;

View File

@ -31,7 +31,7 @@ public:
explicit ThemeAppIcon(QObject *parent = 0);
~ThemeAppIcon();
static const QPixmap getIcon(const QString iconName, const int size);
static const QPixmap getIcon(const QString iconName, const int size, const qreal ratio);
};
#endif // THEMEAPPICON_H

View File

@ -1,6 +1,7 @@
#include <QPixmap>
#include <QImageReader>
#include <QApplication>
#include <QScreen>
namespace Utils {
static QPixmap renderSVG(const QString &path, const QSize &size) {
@ -19,4 +20,26 @@ namespace Utils {
return pixmap;
}
}
static QScreen * screenAt(const QPoint &point) {
for (QScreen *screen : qApp->screens()) {
const QRect r { screen->geometry() };
const QRect rect { r.topLeft(), r.size() * screen->devicePixelRatio() };
if (rect.contains(point)) {
return screen;
}
}
return nullptr;
}
static QScreen * screenAtByScaled(const QPoint &point) {
for (QScreen *screen : qApp->screens()) {
if (screen->geometry().contains(point)) {
return screen;
}
}
return nullptr;
}
}

View File

@ -21,6 +21,7 @@
#include "mainwindow.h"
#include "panel/mainpanel.h"
#include "util/utils.h"
#include <QDebug>
#include <QEvent>
@ -42,36 +43,22 @@ using org::kde::StatusNotifierWatcher;
const QPoint rawXPosition(const QPoint &scaledPos)
{
QScreen *s = qApp->primaryScreen();
for (auto *screen : qApp->screens())
{
const QRect &sg = screen->geometry();
if (sg.contains(scaledPos))
{
s = screen;
break;
}
}
QScreen const * screen = Utils::screenAtByScaled(scaledPos);
const QRect &g = s->geometry();
return g.topLeft() + (scaledPos - g.topLeft()) * s->devicePixelRatio();
return screen ? screen->geometry().topLeft() +
(scaledPos - screen->geometry().topLeft()) *
screen->devicePixelRatio()
: scaledPos;
}
const QPoint scaledPos(const QPoint &rawXPos)
{
QRect g = qApp->primaryScreen()->geometry();
for (auto *screen : qApp->screens())
{
const QRect &sg = screen->geometry();
if (sg.contains(rawXPos))
{
g = sg;
break;
}
}
QScreen const * screen = Utils::screenAt(rawXPos);
return g.topLeft() + (rawXPos - g.topLeft()) / qApp->devicePixelRatio();
return screen
? screen->geometry().topLeft() +
(rawXPos - screen->geometry().topLeft()) / screen->devicePixelRatio()
: rawXPos;
}
MainWindow::MainWindow(QWidget *parent)

View File

@ -73,7 +73,7 @@ void DatetimeWidget::paintEvent(QPaintEvent *e)
{
Q_UNUSED(e);
const auto ratio = qApp->devicePixelRatio();
const auto ratio = devicePixelRatioF();
const Dock::DisplayMode displayMode = qApp->property(PROP_DISPLAY_MODE).value<Dock::DisplayMode>();
const Dock::Position position = qApp->property(PROP_POSITION).value<Dock::Position>();
const QDateTime current = QDateTime::currentDateTime();
@ -188,7 +188,7 @@ void DatetimeWidget::paintEvent(QPaintEvent *e)
const QPixmap DatetimeWidget::loadSvg(const QString &fileName, const QSize size)
{
const auto ratio = qApp->devicePixelRatio();
const auto ratio = devicePixelRatioF();
QPixmap pixmap(size * ratio);
QSvgRenderer renderer(fileName);

View File

@ -52,7 +52,7 @@ AccessPointWidget::AccessPointWidget()
m_securityPixmap = Utils::renderSVG(":/wireless/resources/wireless/security.svg", QSize(16, 16));
m_securityIconSize = m_securityPixmap.size();
m_securityLabel->setPixmap(m_securityPixmap);
m_securityLabel->setFixedSize(m_securityIconSize / qApp->devicePixelRatio());
m_securityLabel->setFixedSize(m_securityIconSize / devicePixelRatioF());
QHBoxLayout *infoLayout = new QHBoxLayout;
infoLayout->addWidget(m_securityLabel);

View File

@ -53,7 +53,7 @@ WirelessList::WirelessList(WirelessDevice *deviceIter, QWidget *parent)
{
setFixedHeight(WIDTH);
const auto ratio = qApp->devicePixelRatio();
const auto ratio = devicePixelRatioF();
QPixmap iconPix = QIcon::fromTheme("notification-network-wireless-full").pixmap(QSize(48, 48) * ratio);
iconPix.setDevicePixelRatio(ratio);

View File

@ -72,7 +72,7 @@ void WiredItem::paintEvent(QPaintEvent *e)
QWidget::paintEvent(e);
QPainter painter(this);
const auto ratio = qApp->devicePixelRatio();
const auto ratio = devicePixelRatioF();
const QRectF &rf = QRectF(rect());
const QRectF &rfp = QRectF(m_icon.rect());
const int x = rf.center().x() - rfp.center().x() / ratio;
@ -104,7 +104,7 @@ void WiredItem::reloadIcon()
// const Dock::DisplayMode displayMode = qApp->property(PROP_DISPLAY_MODE).value<Dock::DisplayMode>();
const Dock::DisplayMode displayMode = Dock::DisplayMode::Efficient;
const auto ratio = qApp->devicePixelRatio();
const auto ratio = devicePixelRatioF();
const int iconSize = displayMode == Dock::Efficient ? 16 : std::min(width(), height()) * 0.8;
QString iconName = "network-";

View File

@ -98,7 +98,7 @@ void WirelessItem::paintEvent(QPaintEvent *e)
// const Dock::DisplayMode displayMode = qApp->property(PROP_DISPLAY_MODE).value<Dock::DisplayMode>();
const Dock::DisplayMode displayMode = Dock::DisplayMode::Efficient;
const auto ratio = qApp->devicePixelRatio();
const auto ratio = devicePixelRatioF();
const int iconSize = displayMode == Dock::Fashion ? std::min(width(), height()) * 0.8 : 16;
QPixmap pixmap = iconPix(displayMode, iconSize * ratio);
pixmap.setDevicePixelRatio(ratio);

View File

@ -56,12 +56,12 @@ void OnboardItem::paintEvent(QPaintEvent *e)
pixmap = loadSvg(iconName, QSize(iconSize, iconSize));
QPainter painter(this);
painter.drawPixmap(rect().center() - pixmap.rect().center() / qApp->devicePixelRatio(), pixmap);
painter.drawPixmap(rect().center() - pixmap.rect().center() / devicePixelRatioF(), pixmap);
}
const QPixmap OnboardItem::loadSvg(const QString &fileName, const QSize &size) const
{
const auto ratio = qApp->devicePixelRatio();
const auto ratio = devicePixelRatioF();
QPixmap pixmap;
pixmap = QIcon::fromTheme(fileName).pixmap(size * ratio);

View File

@ -57,12 +57,12 @@ void PluginWidget::paintEvent(QPaintEvent *e)
pixmap = loadSvg(iconName, QSize(iconSize, iconSize));
QPainter painter(this);
painter.drawPixmap(rect().center() - pixmap.rect().center() / qApp->devicePixelRatio(), pixmap);
painter.drawPixmap(rect().center() - pixmap.rect().center() / devicePixelRatioF(), pixmap);
}
const QPixmap PluginWidget::loadSvg(const QString &fileName, const QSize &size) const
{
const auto ratio = qApp->devicePixelRatio();
const auto ratio = devicePixelRatioF();
QPixmap pixmap;
pixmap = QIcon::fromTheme(fileName).pixmap(size * ratio);

View File

@ -56,12 +56,12 @@ void PluginWidget::paintEvent(QPaintEvent *e)
pixmap = loadSvg(iconName, QSize(iconSize, iconSize));
QPainter painter(this);
painter.drawPixmap(rect().center() - pixmap.rect().center() / qApp->devicePixelRatio(), pixmap);
painter.drawPixmap(rect().center() - pixmap.rect().center() / devicePixelRatioF(), pixmap);
}
const QPixmap PluginWidget::loadSvg(const QString &fileName, const QSize &size) const
{
const auto ratio = qApp->devicePixelRatio();
const auto ratio = devicePixelRatioF();
QPixmap pixmap;
pixmap = QIcon::fromTheme(fileName).pixmap(size * ratio);

View File

@ -28,9 +28,8 @@
DWIDGET_USE_NAMESPACE
const QPixmap getIconFromTheme(const QString &name, const QSize &size)
const QPixmap getIconFromTheme(const QString &name, const QSize &size, const qreal ratio)
{
const auto ratio = qApp->devicePixelRatio();
QPixmap ret = QIcon::fromTheme(name, QIcon::fromTheme("application-x-desktop")).pixmap(size * ratio);
ret.setDevicePixelRatio(ratio);
@ -47,7 +46,7 @@ SinkInputWidget::SinkInputWidget(const QString &inputPath, QWidget *parent)
{
const QString iconName = m_inputInter->icon();
m_volumeIcon->setAccessibleName("app-" + iconName + "-icon");
m_volumeIcon->setPixmap(getIconFromTheme(iconName, QSize(24, 24)));
m_volumeIcon->setPixmap(getIconFromTheme(iconName, QSize(24, 24), devicePixelRatioF()));
m_volumeSlider->setAccessibleName("app-" + iconName + "-slider");
m_volumeSlider->setMinimum(0);
m_volumeSlider->setMaximum(1000);
@ -89,7 +88,7 @@ void SinkInputWidget::setMuteIcon()
if (m_inputInter->mute()) {
const auto ratio = devicePixelRatioF();
QPixmap muteIcon = DHiDPIHelper::loadNxPixmap("://audio-volume-muted-symbolic.svg");
QPixmap appIconSource(getIconFromTheme(m_inputInter->icon(), QSize(24, 24)));
QPixmap appIconSource(getIconFromTheme(m_inputInter->icon(), QSize(24, 24), devicePixelRatioF()));
QPixmap temp(appIconSource.size());
temp.fill(Qt::transparent);
@ -107,7 +106,7 @@ void SinkInputWidget::setMuteIcon()
appIconSource.setDevicePixelRatio(ratio);
m_volumeIcon->setPixmap(appIconSource);
} else {
m_volumeIcon->setPixmap(getIconFromTheme(m_inputInter->icon(), QSize(24, 24)));
m_volumeIcon->setPixmap(getIconFromTheme(m_inputInter->icon(), QSize(24, 24), devicePixelRatioF()));
}
}

View File

@ -178,7 +178,7 @@ void SoundItem::refreshIcon()
iconString = QString("audio-volume-%1-symbolic").arg(volumeString);
}
const auto ratio = qApp->devicePixelRatio();
const auto ratio = devicePixelRatioF();
const int iconSize = displayMode == Dock::Fashion ? std::min(width(), height()) * 0.8 : 16;
const QIcon icon = QIcon::fromTheme(iconString);
m_iconPixmap = icon.pixmap(iconSize * ratio, iconSize * ratio);

View File

@ -170,7 +170,7 @@ void TrashWidget::paintEvent(QPaintEvent *e)
QWidget::paintEvent(e);
QPainter painter(this);
painter.drawPixmap(rect().center() - m_icon.rect().center() / qApp->devicePixelRatio(), m_icon);
painter.drawPixmap(rect().center() - m_icon.rect().center() / devicePixelRatioF(), m_icon);
}
void TrashWidget::resizeEvent(QResizeEvent *e)
@ -192,8 +192,8 @@ void TrashWidget::updateIcon()
const int size = displayMode == Dock::Fashion ? std::min(width(), height()) * 0.8 : 16;
QIcon icon = QIcon::fromTheme(iconString);
m_icon = icon.pixmap(size * qApp->devicePixelRatio(), size * qApp->devicePixelRatio());
m_icon.setDevicePixelRatio(qApp->devicePixelRatio());
m_icon = icon.pixmap(size * devicePixelRatioF(), size * devicePixelRatioF());
m_icon.setDevicePixelRatio(devicePixelRatioF());
update();
}

View File

@ -474,7 +474,7 @@ QPixmap SNITrayWidget::newIconPixmap(IconType iconType)
break;
}
const auto ratio = qApp->devicePixelRatio();
const auto ratio = devicePixelRatioF();
const int iconSizeScaled = IconSize * ratio;
do {
// load icon from sni dbus
@ -521,7 +521,7 @@ QPixmap SNITrayWidget::newIconPixmap(IconType iconType)
// so, it should be the last fallback
if (!iconName.isEmpty()) {
// ThemeAppIcon::getIcon 会处理高分屏缩放问题
pixmap = ThemeAppIcon::getIcon(iconName, IconSize);
pixmap = ThemeAppIcon::getIcon(iconName, IconSize, devicePixelRatioF());
if (!pixmap.isNull()) {
break;
}