summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Faure <david.faure@kdab.com>2024-01-09 18:35:38 +0100
committerDavid Faure <david.faure@kdab.com>2024-01-09 23:15:14 +0100
commitf7258e384c90c6e3f76e99a8b04520297f351c9c (patch)
treed31a9abd1a249419eb480c395c31f9c53f2d5e96
parent7e134051c23f2ec6338744c5ebe6210bbcecfdda (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.cpp51
-rw-r--r--src/svgwidgets/qsvgwidget.h2
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)