Vicent Mas escribió:
On 2009-11-06 Baz Walter <baz...@ftml.net> said:

...
your implementation of QAbstractItemModel.index is going to get called
*a lot* and in many unforseen ways.

Yes, but it is a general fact, not something that happens to my particular implementation, right?


i think a more sane implementation
would be something like this:

     def index(self, row, column, parent):
         if self.hasIndex(row, column, parent):
             branch = self.nodeFromIndex(parent)
             return self.createIndex(row, column, branch.childAtRow(row))
         return QModelIndex()

this fixes your immediate bug, and will probably avoid many others.


I know that my implementation is very rough, but it is intended just for testing purposes. Of course your workaround and other similar (like the one sent by Linos) fixes the problem, but they leave the main question unanswered: why wrong row values are passed to the index method? Is it expected? If it is developers are forced to include good sanity code in their index method implementation (as you and Linos did), but I've not seen any reference to this in the Qt documentation. IMHO the Qt model implementation should not allow wrong row values to be passed to the index method. In fact, the example in the 'Editable Tree Model Example' section of the Qt documentation doesn't check at all the validity of the row argument passed to the index method implementation.

On the other hand the fact that my script works fine with some Qt/PyQt versions but fails with recent versions seems to indicate that there is a bug either in the Qt implemention of models or in that PyQt versions.

Vicent

PS: Baz, thanks for your code snippet
::

        Share what you know, learn what you don't

Hi,
in the qt examples from qt 4.5 documentation you can see they use this in the model:
http://doc.trolltech.com/4.5/itemviews-simpletreemodel-treemodel-cpp.html

QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent)
             const
 {
     if (!hasIndex(row, column, parent))
         return QModelIndex();

     TreeItem *parentItem;

     if (!parent.isValid())
         parentItem = rootItem;
     else
         parentItem = static_cast<TreeItem*>(parent.internalPointer());

     TreeItem *childItem = parentItem->child(row);
     if (childItem)
         return createIndex(row, column, childItem);
     else
         return QModelIndex();
 }


and this in the item class.
http://doc.trolltech.com/4.5/itemviews-simpletreemodel-treeitem-cpp.html

TreeItem *TreeItem::child(int row)
 {
     return childItems.value(row);
 }

but they can do this because QList .value method dont get an error if it is out of bounds.
http://doc.trolltech.com/4.5/qlist.html#value

T QList::value ( int i ) const

Returns the value at index position i in the list.

If the index i is out of bounds, the function returns a default-constructed value. If you are certain that the index is going to be within bounds, you can use at() instead, which is slightly faster.


I am using this same strategy but like i am using python list i check before if i can return the children, you can use a "try except" too.

Regards,
Miguel Angel.
_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to