Widgets/QMdiSubWindow: fix high-dpi painting of control buttons

The high-dpi painting for the buttons in the QMdiSubWindow was broken
for the windowsvista style because an invalid widget was passed to the
paint routines. This lead to a wrong calculation of the devicePixelRatio
and in the end very blurry icons.

Pick-to: 6.7
Fixes: QTBUG-127288
Change-Id: I0f604ddb4faf66a6e850a1504582076f22418fcd
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
Reviewed-by: Wladimir Leuschner <wladimir.leuschner@qt.io>
(cherry picked from commit 8b261a2ad7884f8fe7a93a678c9fce5052e42c98)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Christian Ehrlicher 2024-08-16 19:06:04 +02:00 committed by Qt Cherry-pick Bot
parent a7fc60015d
commit 2d6788d6eb
2 changed files with 10 additions and 15 deletions

View File

@ -360,7 +360,7 @@ class ControlLabel : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
ControlLabel(QMdiSubWindow *subWindow, QWidget *parent = nullptr); ControlLabel(QWidget *parent = nullptr);
QSize sizeHint() const override; QSize sizeHint() const override;
@ -382,10 +382,9 @@ private:
}; };
} // namespace QMdi } // namespace QMdi
ControlLabel::ControlLabel(QMdiSubWindow *subWindow, QWidget *parent) ControlLabel::ControlLabel(QWidget *parent)
: QWidget(parent), isPressed(false) : QWidget(parent), isPressed(false)
{ {
Q_UNUSED(subWindow);
setFocusPolicy(Qt::NoFocus); setFocusPolicy(Qt::NoFocus);
updateWindowIcon(); updateWindowIcon();
setFixedSize(label.deviceIndependentSize().toSize()); setFixedSize(label.deviceIndependentSize().toSize());
@ -492,7 +491,7 @@ class ControllerWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
ControllerWidget(QMdiSubWindow *subWindow, QWidget *parent = nullptr); ControllerWidget(QWidget *parent = nullptr);
QSize sizeHint() const override; QSize sizeHint() const override;
void setControlVisible(QMdiSubWindowPrivate::WindowStateAction action, bool visible); void setControlVisible(QMdiSubWindowPrivate::WindowStateAction action, bool visible);
inline bool hasVisibleControls() const inline bool hasVisibleControls() const
@ -520,12 +519,11 @@ private:
QStyle::SubControl hoverControl; QStyle::SubControl hoverControl;
QStyle::SubControls visibleControls; QStyle::SubControls visibleControls;
void initStyleOption(QStyleOptionComplex *option) const; void initStyleOption(QStyleOptionComplex *option) const;
QMdiArea *mdiArea;
inline QStyle::SubControl getSubControl(const QPoint &pos) const inline QStyle::SubControl getSubControl(const QPoint &pos) const
{ {
QStyleOptionComplex opt; QStyleOptionComplex opt;
initStyleOption(&opt); initStyleOption(&opt);
return style()->hitTestComplexControl(QStyle::CC_MdiControls, &opt, pos, mdiArea); return style()->hitTestComplexControl(QStyle::CC_MdiControls, &opt, pos, this);
} }
}; };
} // namespace QMdi } // namespace QMdi
@ -533,15 +531,12 @@ private:
/* /*
\internal \internal
*/ */
ControllerWidget::ControllerWidget(QMdiSubWindow *subWindow, QWidget *parent) ControllerWidget::ControllerWidget(QWidget *parent)
: QWidget(parent), : QWidget(parent),
activeControl(QStyle::SC_None), activeControl(QStyle::SC_None),
hoverControl(QStyle::SC_None), hoverControl(QStyle::SC_None),
visibleControls(QStyle::SC_None), visibleControls(QStyle::SC_None)
mdiArea(nullptr)
{ {
if (subWindow->parentWidget())
mdiArea = qobject_cast<QMdiArea *>(subWindow->parentWidget()->parentWidget());
setFocusPolicy(Qt::NoFocus); setFocusPolicy(Qt::NoFocus);
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
setMouseTracking(true); setMouseTracking(true);
@ -555,9 +550,9 @@ QSize ControllerWidget::sizeHint() const
ensurePolished(); ensurePolished();
QStyleOptionComplex opt; QStyleOptionComplex opt;
initStyleOption(&opt); initStyleOption(&opt);
const int buttonSize = style()->pixelMetric(QStyle::PM_TitleBarButtonSize, &opt, mdiArea); const int buttonSize = style()->pixelMetric(QStyle::PM_TitleBarButtonSize, &opt, this);
QSize size(3 * buttonSize, buttonSize); QSize size(3 * buttonSize, buttonSize);
return style()->sizeFromContents(QStyle::CT_MdiControls, &opt, size, mdiArea); return style()->sizeFromContents(QStyle::CT_MdiControls, &opt, size, this);
} }
void ControllerWidget::setControlVisible(QMdiSubWindowPrivate::WindowStateAction action, bool visible) void ControllerWidget::setControlVisible(QMdiSubWindowPrivate::WindowStateAction action, bool visible)
@ -593,7 +588,7 @@ void ControllerWidget::paintEvent(QPaintEvent * /*paintEvent*/)
opt.state |= QStyle::State_MouseOver; opt.state |= QStyle::State_MouseOver;
} }
QPainter painter(this); QPainter painter(this);
style()->drawComplexControl(QStyle::CC_MdiControls, &opt, &painter, mdiArea); style()->drawComplexControl(QStyle::CC_MdiControls, &opt, &painter, this);
} }
/* /*

View File

@ -42,7 +42,7 @@ template<typename T>
class ControlElement : public T // ELFVERSION:ignore class ControlElement : public T // ELFVERSION:ignore
{ {
public: public:
ControlElement(QMdiSubWindow *child) : T(child, nullptr) ControlElement(QMdiSubWindow *child) : T(nullptr)
{ {
Q_ASSERT(child); Q_ASSERT(child);
mdiChild = child; mdiChild = child;