Prevent QGestureManager crash.
Use QPointer to prevent dereferencing stale pointers stored in m_gestureTargets. Add null pointer tests in addition to the Q_ASSERTs on the pointers returned by m_gestureTargets.value(). The intention is to assert in debug mode but keep going in release mode. Change-Id: Icdef8cc02040bddc88f4bcb268e9ca0ac252557d Task-number: QTBUG-46264 Reviewed-by: Pawel Kurdybacha <pawel.kurdybacha@gmail.com> Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com>bb10
parent
6f9e845d9b
commit
111ee58c06
|
|
@ -405,6 +405,8 @@ void QGestureManager::cancelGesturesForChildren(QGesture *original)
|
|||
Q_ASSERT(original);
|
||||
QWidget *originatingWidget = m_gestureTargets.value(original);
|
||||
Q_ASSERT(originatingWidget);
|
||||
if (!originatingWidget)
|
||||
return;
|
||||
|
||||
// iterate over all active gestures and all maybe gestures
|
||||
// for each find the owner
|
||||
|
|
@ -565,7 +567,8 @@ void QGestureManager::getGestureTargets(const QSet<QGesture*> &gestures,
|
|||
foreach (QGesture *gesture, gestures) {
|
||||
QWidget *receiver = m_gestureTargets.value(gesture, 0);
|
||||
Q_ASSERT(receiver);
|
||||
gestureByTypes[gesture->gestureType()].insert(receiver, gesture);
|
||||
if (receiver)
|
||||
gestureByTypes[gesture->gestureType()].insert(receiver, gesture);
|
||||
}
|
||||
|
||||
// for each gesture type
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ private:
|
|||
QHash<QGesture *, QGestureRecognizer *> m_gestureToRecognizer;
|
||||
QHash<QGesture *, QObject *> m_gestureOwners;
|
||||
|
||||
QHash<QGesture *, QWidget *> m_gestureTargets;
|
||||
QHash<QGesture *, QPointer<QWidget> > m_gestureTargets;
|
||||
|
||||
int m_lastCustomGestureId;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue