diff options
author | David Faure <david.faure@kdab.com> | 2024-01-09 18:35:38 +0100 |
---|---|---|
committer | David Faure <david.faure@kdab.com> | 2024-01-09 23:15:14 +0100 |
commit | f7258e384c90c6e3f76e99a8b04520297f351c9c (patch) | |
tree | d31a9abd1a249419eb480c395c31f9c53f2d5e96 | |
parent | 7e134051c23f2ec6338744c5ebe6210bbcecfdda (diff) |
QSvgWidget: replace showEvent/hideEvent with event filter
This is more behavior-compatible, in case a QSvgWidget subclass
was reimplementing showEvent and not calling the base class,
or if the base class call was devirtualized by the compiler.
Pick-to: 6.7
Change-Id: I022a5258088d15133e0910eb11b1c917b0f24c9c
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
-rw-r--r-- | src/svgwidgets/qsvgwidget.cpp | 51 | ||||
-rw-r--r-- | src/svgwidgets/qsvgwidget.h | 2 |
2 files changed, 29 insertions, 24 deletions
diff --git a/src/svgwidgets/qsvgwidget.cpp b/src/svgwidgets/qsvgwidget.cpp index fc8d0a4..da2ac45 100644 --- a/src/svgwidgets/qsvgwidget.cpp +++ b/src/svgwidgets/qsvgwidget.cpp @@ -48,6 +48,32 @@ public: QSvgRenderer *renderer; }; +// Event listener for ShowEvent/HideEvent on QSvgWidget (which can't just +// reimplement event() or showEvent()/hideEvent() or eventFilter() in case +// a subclass doesn't call the base class in those methods) +// ### Qt 7: remove the event filter; move this logic into showEvent/hideEvent; add event() override +class QSvgWidgetListener : public QObject +{ +public: + using QObject::QObject; + +protected: + bool eventFilter(QObject *obj, QEvent *event) override + { + if (event->type() == QEvent::Show) + renderer()->setAnimationEnabled(true); + else if (event->type() == QEvent::Hide) + renderer()->setAnimationEnabled(false); + return QObject::eventFilter(obj, event); + } + +private: + QSvgRenderer *renderer() + { + return static_cast<QSvgWidgetPrivate *>(QObjectPrivate::get(parent()))->renderer; + } +}; + /*! Constructs a new SVG display widget with the given \a parent. */ @@ -57,6 +83,7 @@ QSvgWidget::QSvgWidget(QWidget *parent) d_func()->renderer = new QSvgRenderer(this); QObject::connect(d_func()->renderer, SIGNAL(repaintNeeded()), this, SLOT(update())); + installEventFilter(new QSvgWidgetListener(this)); } /*! @@ -64,11 +91,9 @@ QSvgWidget::QSvgWidget(QWidget *parent) of the specified \a file. */ QSvgWidget::QSvgWidget(const QString &file, QWidget *parent) - : QWidget(*new QSvgWidgetPrivate, parent, {}) + : QSvgWidget(parent) { - d_func()->renderer = new QSvgRenderer(file, this); - QObject::connect(d_func()->renderer, SIGNAL(repaintNeeded()), - this, SLOT(update())); + d_func()->renderer->load(file); } /*! @@ -147,24 +172,6 @@ void QSvgWidget::paintEvent(QPaintEvent *) } /*! - \reimp -*/ -void QSvgWidget::showEvent(QShowEvent *) -{ - Q_D(QSvgWidget); - d->renderer->setAnimationEnabled(true); -} - -/*! - \reimp -*/ -void QSvgWidget::hideEvent(QHideEvent *) -{ - Q_D(QSvgWidget); - d->renderer->setAnimationEnabled(false); -} - -/*! Loads the contents of the specified SVG \a file and updates the widget. */ void QSvgWidget::load(const QString &file) diff --git a/src/svgwidgets/qsvgwidget.h b/src/svgwidgets/qsvgwidget.h index cb17969..3f79bed 100644 --- a/src/svgwidgets/qsvgwidget.h +++ b/src/svgwidgets/qsvgwidget.h @@ -34,8 +34,6 @@ public Q_SLOTS: void load(const QByteArray &contents); protected: void paintEvent(QPaintEvent *event) override; - void showEvent(QShowEvent *event) override; - void hideEvent(QHideEvent *event) override; private: Q_DISABLE_COPY(QSvgWidget) |