[Qt-qml] emit data on a QAbstracListModel does not update the QML ListView.

Bartosh Wroblevksy bartosh at live.com
Sat Sep 18 07:57:47 CEST 2010


Hi Guys,
I applied the patch to Qt 4.7.0 RC1 here on my computer and it does fix http://bugreports.qt.nokia.com/browse/QTBUG-13664 but it does not seem to fix the other bug that was closed namely http://bugreports.qt.nokia.com/browse/QTBUG-13628. I'll check again to make sure.
Thanks,
Bartosh




> From: martin.jones at nokia.com
> To: qt-qml at trolltech.com
> Date: Thu, 16 Sep 2010 11:21:20 +1000
> CC: steveire at gmail.com
> Subject: Re: [Qt-qml] emit data on a QAbstracListModel does not update the	QML ListView.
> 
> On Wed, 15 Sep 2010 04:32:37 am ext Stephen Kelly wrote:
> > Bartosh Wroblevksy wrote:
> > > Hello Steve,
> > > Thank you for filing the BR.  I have a few questions.
> > > 
> > > 1) What's the number of the bug?
> > 
> > http://bugreports.qt.nokia.com/browse/QTBUG-13628
> 
> This turned out to be another manifestation of the dataChanged() bug also:
> 
> http://bugreports.qt.nokia.com/browse/QTBUG-13664
> 
> Martin.
> 
> 
> 
> > > 2) I have trouble seeing how in this case, moving rows and changing data
> > > is not equivalent.  In fact,unless my morning coffee was not caffeinated.
> > > If I write
> > > 
> > >     m_elements[1] ="x";   emit dataChanged(index(1,0), index(1,0));
> > >  
> > >  Should I not expect to see the QML listview change?
> > 
> > Yes, you are right. Indeed that is another bug. What you are doing
> > WorksFromMe, but I don't have a plugin for the model like you do, but I
> > create the QDeclarativeMainView in an application and use
> > setContextProperty(myModel). Maybe if loaded through a plugin qml doesn't
> > handle that signal somehow?
> > 
> > It's worth another bug report.
> > 
> > > 3) beginResetModel() and endResetModel() is clearly not what I want. My
> > > application flickers horribly. In fact I hadinitially tried an emit
> > > modelReset() which also made my application flick horribly. I was hoping
> > > to avoid the flickerwith an emit dataChanged. Until this bug gets fixed,
> > > is there any better alternative?
> > 
> > I don't think so, sorry.
> > 
> > > 4) You mention >*plus* updating
> > > persistent indexes in between.>Sorry, can you elaborate on this?
> > 
> > doMove()
> > {
> >   layoutAboutToBeChanged();
> >   // do the move
> >   m_items.move(0, 1);
> > 
> >   QModelIndexList pers = persistentIndexList();
> >   foreach(const QModelIndex &idx, pers) {
> >     if ( idx.row() == 0 ) {
> >       const QModelIndex newIdx = createIndex(1, 0);
> >       changePersistentIndex(idx, newIdx);
> >     }
> >     if ( idx.row() == 1 ) {
> >       const QModelIndex newIdx = createIndex(0, 0);
> >       changePersistentIndex(idx, newIdx);
> >     }
> >   }
> >   layoutChanged();
> > }
> > 
> > I hardcoded the 0 and 1 for clarity, but you can imagine that if you're
> > moving an arbitrary range of items an arbitrary distance the implementation
> > gets difficult. Avoid doing it yourself where possible and use
> > beginMoveRows etc instead.
> > 
> > If you want to see an implementation implementing a move in a tree using
> > just the layout change stuff see
> > ModelMoveLayoutChangeCommand::emitPreSignal and
> > ModelMoveLayoutChangeCommand::emitPostSignal here:
> > 
> > http://websvn.kde.org/trunk/KDE/kdelibs/kdeui/tests/proxymodeltestsuite/dyn
> > amictreemodel.cpp?view=markup
> > 
> > Compare to ModelMoveCommand::emitPreSignal and
> > ModelMoveCommand::emitPostSignal
> > 
> > Updating those is needed for selections, tree expansion proxy models etc to
> > work properly and not crash.
> > 
> > > 5) You
> > > wrote
> > > 
> > >> + beginMoveRows(QModelIndex(), 0, 0, QModelIndex(), 2);>
> > >> m_elements.move(0,1);> + endMoveRows();
> > > 
> > > Since the destination child is 1, I would have expected to write
> > > 
> > >> + beginMoveRows(QModelIndex(), 0, 0, QModelIndex(), 1);>
> > >> m_elements.move(0,1);> + endMoveRows();
> > > 
> > > but then again, my coffee may be decaffeinated.
> > 
> > It's common for people to think that. I improved the docs with diagrams for
> > 4.7:
> > 
> > http://doc.trolltech.com/main-snapshot/qabstractitemmodel.html#beginMoveRow
> > s
> > 
> > It's consistent with other model api where you identify the 'gap' you want
> > to move the item to. Item at position 0 can't be moved to gap 0 or 1
> > because it is already in between them. It can be moved to position 2
> > though. Unfortunately the QList::move API is not the same. It's also
> > easier to implement dropMimeData like this.
> > 
> > All the best,
> > 
> > Steve.
> > _______________________________________________
> > Qt-qml mailing list
> > Qt-qml at trolltech.com
> > http://lists.trolltech.com/mailman/listinfo/qt-qml
> 
> -- 
> Martin
> _______________________________________________
> Qt-qml mailing list
> Qt-qml at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-qml
 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt.nokia.com/pipermail/qt-qml/attachments/20100918/a6a26023/attachment.html 


More information about the Qt-qml mailing list