From 48c17c80b9bb003ff92150d6ca8a54109b987715 Mon Sep 17 00:00:00 2001 From: Paolo Angelelli Date: Sat, 8 Apr 2017 00:02:42 +0200 Subject: Protect QGeoMap pointer with QPointer m_map inside QDeclarativeGeoMap is created, but also destroyed, by the engine. In some cases (dynamic QML object creation/destruction) the engine may disappear before the Map. This patch introduces a QPointer to prevent a dangling pointer Change-Id: Ice3c57b4dbeb96ee8d7e4d401654b9085c105dec Reviewed-by: Qt CI Bot Reviewed-by: Alex Blasche --- .../declarativemaps/qdeclarativegeomap.cpp | 26 +++++++++++----------- .../declarativemaps/qdeclarativegeomap_p.h | 2 +- .../declarativemaps/qquickgeomapgesturearea.cpp | 2 +- .../declarativemaps/qquickgeomapgesturearea_p.h | 5 +++-- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/location/declarativemaps/qdeclarativegeomap.cpp b/src/location/declarativemaps/qdeclarativegeomap.cpp index ff34f1ea..35520227 100644 --- a/src/location/declarativemaps/qdeclarativegeomap.cpp +++ b/src/location/declarativemaps/qdeclarativegeomap.cpp @@ -278,17 +278,17 @@ void QDeclarativeGeoMap::onMapChildrenChanged() copyrights = m_copyrights.data(); - connect(m_map, SIGNAL(copyrightsChanged(QImage)), + connect(m_map.data(), SIGNAL(copyrightsChanged(QImage)), copyrights, SLOT(copyrightsChanged(QImage))); - connect(m_map, SIGNAL(copyrightsChanged(QImage)), + connect(m_map.data(), SIGNAL(copyrightsChanged(QImage)), this, SIGNAL(copyrightsChanged(QImage))); - connect(m_map, SIGNAL(copyrightsChanged(QString)), + connect(m_map.data(), SIGNAL(copyrightsChanged(QString)), copyrights, SLOT(copyrightsChanged(QString))); - connect(m_map, SIGNAL(copyrightsChanged(QString)), + connect(m_map.data(), SIGNAL(copyrightsChanged(QString)), this, SIGNAL(copyrightsChanged(QString))); - connect(m_map, SIGNAL(copyrightsStyleSheetChanged(QString)), + connect(m_map.data(), SIGNAL(copyrightsStyleSheetChanged(QString)), copyrights, SLOT(onCopyrightsStyleSheetChanged(QString))); connect(copyrights, SIGNAL(linkActivated(QString)), @@ -724,7 +724,7 @@ void QDeclarativeGeoMap::onCameraCapabilitiesChanged(const QGeoCameraCapabilitie */ void QDeclarativeGeoMap::mappingManagerInitialized() { - m_map = m_mappingManager->createMap(this); + m_map = QPointer(m_mappingManager->createMap(this)); if (!m_map) return; @@ -759,23 +759,23 @@ void QDeclarativeGeoMap::mappingManagerInitialized() m_copyrights = new QDeclarativeGeoMapCopyrightNotice(this); m_copyrights->onCopyrightsStyleSheetChanged(m_map->copyrightsStyleSheet()); - connect(m_map, SIGNAL(copyrightsChanged(QImage)), + connect(m_map.data(), SIGNAL(copyrightsChanged(QImage)), m_copyrights.data(), SLOT(copyrightsChanged(QImage))); - connect(m_map, SIGNAL(copyrightsChanged(QImage)), + connect(m_map.data(), SIGNAL(copyrightsChanged(QImage)), this, SIGNAL(copyrightsChanged(QImage))); - connect(m_map, SIGNAL(copyrightsChanged(QString)), + connect(m_map.data(), SIGNAL(copyrightsChanged(QString)), m_copyrights.data(), SLOT(copyrightsChanged(QString))); - connect(m_map, SIGNAL(copyrightsChanged(QString)), + connect(m_map.data(), SIGNAL(copyrightsChanged(QString)), this, SIGNAL(copyrightsChanged(QString))); - connect(m_map, SIGNAL(copyrightsStyleSheetChanged(QString)), + connect(m_map.data(), SIGNAL(copyrightsStyleSheetChanged(QString)), m_copyrights.data(), SLOT(onCopyrightsStyleSheetChanged(QString))); connect(m_copyrights.data(), SIGNAL(linkActivated(QString)), this, SIGNAL(copyrightLinkActivated(QString))); - connect(m_map, &QGeoMap::sgNodeChanged, this, &QQuickItem::update); - connect(m_map, &QGeoMap::cameraCapabilitiesChanged, this, &QDeclarativeGeoMap::onCameraCapabilitiesChanged); + connect(m_map.data(), &QGeoMap::sgNodeChanged, this, &QQuickItem::update); + connect(m_map.data(), &QGeoMap::cameraCapabilitiesChanged, this, &QDeclarativeGeoMap::onCameraCapabilitiesChanged); // set visibility of copyright notice m_copyrights->setCopyrightsVisible(m_copyrightsVisible); diff --git a/src/location/declarativemaps/qdeclarativegeomap_p.h b/src/location/declarativemaps/qdeclarativegeomap_p.h index da430ce5..f08998e2 100644 --- a/src/location/declarativemaps/qdeclarativegeomap_p.h +++ b/src/location/declarativemaps/qdeclarativegeomap_p.h @@ -248,7 +248,7 @@ private: QList m_supportedMapTypes; QList m_mapViews; QQuickGeoMapGestureArea *m_gestureArea; - QGeoMap *m_map; + QPointer m_map; QPointer m_copyrights; QList > m_mapItems; QList > m_mapItemGroups; diff --git a/src/location/declarativemaps/qquickgeomapgesturearea.cpp b/src/location/declarativemaps/qquickgeomapgesturearea.cpp index 412e33a1..3511226c 100644 --- a/src/location/declarativemaps/qquickgeomapgesturearea.cpp +++ b/src/location/declarativemaps/qquickgeomapgesturearea.cpp @@ -506,7 +506,7 @@ QQuickGeoMapGestureArea::QQuickGeoMapGestureArea(QDeclarativeGeoMap *map) /*! \internal */ -void QQuickGeoMapGestureArea::setMap(QGeoMap *map) +void QQuickGeoMapGestureArea::setMap(QPointer map) { if (m_map || !map) return; diff --git a/src/location/declarativemaps/qquickgeomapgesturearea_p.h b/src/location/declarativemaps/qquickgeomapgesturearea_p.h index 13278651..320c0fbe 100644 --- a/src/location/declarativemaps/qquickgeomapgesturearea_p.h +++ b/src/location/declarativemaps/qquickgeomapgesturearea_p.h @@ -50,6 +50,7 @@ #include +#include #include #include #include @@ -175,7 +176,7 @@ public: void setMaximumZoomLevel(qreal max); qreal maximumZoomLevel() const; - void setMap(QGeoMap *map); + void setMap(QPointer map); bool preventStealing() const; void setPreventStealing(bool prevent); @@ -264,7 +265,7 @@ private: void updateFlickParameters(const QPointF &pos); private: - QGeoMap *m_map; + QPointer m_map; QDeclarativeGeoMap *m_declarativeMap; bool m_enabled; -- cgit v1.2.1