on xenial help sign in
Qt 5.0 crashes if we release the items just after itemCreated
57fa3efAlbert Astals
plugins/ListViewWithPageHeader/listviewwithpageheader.cpp+10−1
@@ -493,7 +493,7 @@ bool ListViewWithPageHeader::addVisibleItems(qreal fillFrom, qreal fillTo, bool
493 return changed;
493 return changed;
494}
494}
495
495
496−void ListViewWithPageHeader::releaseItem(ListItem *listItem)
496+void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
497{
497{
498 QQuickItem *item = listItem->m_item;
498 QQuickItem *item = listItem->m_item;
499 QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item);
499 QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item);
@@ -506,6 +506,11 @@ void ListViewWithPageHeader::releaseItem(ListItem *listItem)
506 delete listItem;
506 delete listItem;
507}
507}
508
508
509+void ListViewWithPageHeader::releaseItem(ListItem *listItem)
510+{
511+ m_itemsToRelease << listItem;
512+}
513+
509void ListViewWithPageHeader::updateWatchedRoles()
514void ListViewWithPageHeader::updateWatchedRoles()
510{
515{
511 if (m_delegateModel) {
516 if (m_delegateModel) {
@@ -967,6 +972,10 @@ void ListViewWithPageHeader::layout()
967
972
968void ListViewWithPageHeader::updatePolish()
973void ListViewWithPageHeader::updatePolish()
969{
974{
975+ Q_FOREACH(ListItem *item, m_itemsToRelease)
976+ reallyReleaseItem(item);
977+ m_itemsToRelease.clear();
978+
970 if (!model())
979 if (!model())
971 return;
980 return;
972
981
plugins/ListViewWithPageHeader/listviewwithpageheader.h+5
@@ -114,6 +114,7 @@ private:
114 void headerHeightChanged(qreal newHeaderHeight, qreal oldHeaderHeight, qreal oldHeaderY);
114 void headerHeightChanged(qreal newHeaderHeight, qreal oldHeaderHeight, qreal oldHeaderY);
115 ListItem *itemAtIndex(int modelIndex) const; // Returns the item at modelIndex if has been created
115 ListItem *itemAtIndex(int modelIndex) const; // Returns the item at modelIndex if has been created
116 void releaseItem(ListItem *item);
116 void releaseItem(ListItem *item);
117+ void reallyReleaseItem(ListItem *item);
117 void updateWatchedRoles();
118 void updateWatchedRoles();
118 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
119 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
119 QQuickItem *getSectionItem(const QString &sectionText);
120 QQuickItem *getSectionItem(const QString &sectionText);
@@ -149,6 +150,10 @@ private:
149 QQuickItem *m_topSectionItem;
150 QQuickItem *m_topSectionItem;
150
151
151 bool m_forceNoClip;
152 bool m_forceNoClip;
153+
154+ // Qt 5.0 doesn't like releasing the items just after itemCreated
155+ // so we delay the releasing until the next updatePolish
156+ QList<ListItem *> m_itemsToRelease;
152};
157};
153
158
154
159