[PyKDE] Re: iterating over a QListView

David Boddie david at boddie.org.uk
Tue Feb 22 23:27:39 GMT 2005


On Tue, 22 Feb 2005, Christopher J. Bottaro wrote:

> Right, but what I meant was does PyQt turn those iterator classes into
> "Python iterables".  By that I mean, can they be used in a for loop such
> as:
>
> # lv is a QListView
> for lvi in QListViewItemIterator(lv):
>   # do something with the list view item
>
> The answer is no, btw.  The above code yields a "TypeError: iteration over
> non-sequence" exception.

Try the following:

class Iterator:
  def __init__(self, obj):
    self.data = obj.firstChild()
  def __iter__(self):
    return self
  def next(self):
    item = self.data
    if item is None:
      raise StopIteration
    else:
      self.data = self.data.nextSibling()
    return item

for lvi in Iterator(lv):
 # Do something with the list view item.

That should work for any item class that implements firstChild() and
nextSibling() methods.

> That kinda stinks, it would be nice if it was more Pythonic (while still
> adhering to the C++ API of course).

It seems that some far-sighted person has thoughtfully provided some recipes
to solve just this sort of problem:

  http://www.diotavelli.net/PyQtWiki/ListBoxAndListViewIterators

Maybe I should add the above class to that page.

Hope this helps,

David




More information about the PyQt mailing list