[Interest] QSortFilterProxyModel::removeRows()

Jordi Pujol pisoengracia at gmail.com
Fri Jun 1 08:01:10 CEST 2012


El dv 01 de 06 de 2012 a les 14:15 +0900, en/na Paul England va
escriure:
> Hi
> 
> I wrote this really long email, and learned a lot about the problem in
> doing so.  So, I guess it was time well spent.  Still frustrated.
> Here's the summed up problem:
> 
> I have a QAbstrctTabelModel, QSortFilterProxyModel, QItemDelegate, and
> a QTableView (all subclassed).  As you'd expect, the
> QSortFilterProxyModel filters out what I don't want, the delegate
> paints what I do, and the view displays everything.  Some rows are
> updated, and based on user-defined criteria, need to be removed
> *AFTER* the proxy  has let them in.  Before, I was calling
> invalidate() in the proxy, but that was calling filterAcceptsRow() on
> all rows (visible or not).  Yikes.  So, I'm now doing removeRows() for
> the row(s) that must be removed.
> 
> Caveat: my subclassed delegate's paint() is being passed a
> QModelIndex() with the *old* data.
> 
> Example, my rows are.
> Harry
> Larry
> Bob
> 
> bool my_proxy::removeRows( int row, int count, const QModelIndex& )
> {
> 
>     beginRemoveRows( QModelIndex(), row, count + row - 1 );
>     // remove data from model here
>     endRemoveRows();
> 
> }
> 
> if I do:
> removeRows( 2, 1 );
> 
> My model will then show it only has two items. 
> Harry and Bob
> 
> HOWEVER, for the subsequent call to my_delegeate::paint( QPainter*,
> const QStyledOptionViewItem& opt, const QModelIndex& index ) will have
> the old index.  paint will be called twice, and
> index.data().toString() will have Harry for the 1st one, and Larry for
> the 2nd.  
> 
> Am I missing something?
> Thanks

Perhaps the fact that indexes are 0-based ?

0 - Harry
1 - Larry
2 - Bob

So if you call removeRows( 2, 1 ); you're removing Bob, as expected...




More information about the Interest mailing list