ListView segmentation fault when setting highlight to null
authorMartin Jones <martin.jones@nokia.com>
Mon, 30 May 2011 05:26:06 +0000 (15:26 +1000)
committerMartin Jones <martin.jones@nokia.com>
Mon, 30 May 2011 06:14:51 +0000 (16:14 +1000)
Setting view highlight to null due to focus change caused a crash
since graphicsview accessed the highlight item after it had been
deleted.  Remove highlight item from scene and deleteLater(),
as is done for delegates.

Change-Id: I5bfd59095aca90d3adca805bc4f61c92c192ee1b
Task-number: QTBUG-19509
Reviewed-by: Bea Lam
(cherry picked from commit b9d5cb9334e7d9da71af169802a01f8d344151a7)

src/declarative/graphicsitems/qdeclarativegridview.cpp
src/declarative/graphicsitems/qdeclarativelistview.cpp
src/declarative/graphicsitems/qdeclarativepathview.cpp

index a3395a4..7e8472a 100644 (file)
@@ -818,7 +818,9 @@ void QDeclarativeGridViewPrivate::createHighlight()
     if (highlight) {
         if (trackedItem == highlight)
             trackedItem = 0;
-        delete highlight->item;
+        if (highlight->item->scene())
+            highlight->item->scene()->removeItem(highlight->item);
+        highlight->item->deleteLater();
         delete highlight;
         highlight = 0;
         delete highlightXAnimator;
index ef6b032..29cb76e 100644 (file)
@@ -943,7 +943,9 @@ void QDeclarativeListViewPrivate::createHighlight()
     if (highlight) {
         if (trackedItem == highlight)
             trackedItem = 0;
-        delete highlight->item;
+        if (highlight->item->scene())
+            highlight->item->scene()->removeItem(highlight->item);
+        highlight->item->deleteLater();
         delete highlight;
         highlight = 0;
         delete highlightPosAnimator;
index be2bd60..65ce3b2 100644 (file)
@@ -203,7 +203,9 @@ void QDeclarativePathViewPrivate::createHighlight()
 
     bool changed = false;
     if (highlightItem) {
-        delete highlightItem;
+        if (highlightItem->scene())
+            highlightItem->scene()->removeItem(highlightItem);
+        highlightItem->deleteLater();
         highlightItem = 0;
         changed = true;
     }