2011-01-07 15 views
19

Obecnie używam następujących pętli while w klasy, która dziedziczy QtGui.QListWidget iteracyjne wszystkie elementy:PyQt4: Jak iteracyjne wszystkie przedmioty w QListWidget

i = 0 
    while i < self.count(): 
     item = self.item(i) 

     i += 1 

Miałem nadzieję, że mogę używać:

for item in self.items(): 

, ale metoda items() chce obiektu QMimeData, którego nie wiem, jak skonstruować, aby zwrócić wszystkie elementy. Czy istnieje podejście czystsze niż moja pętla while powyżej?

Odpowiedz

18

Nie wiem, co to jest z typem MIME i nie mogłem również znaleźć metody wygody. Ale możesz napisać prostą metodę i zrobić:

def iterAllItems(self): 
    for i in range(self.count()): 
     yield self.item(i) 

Jest nawet leniwy (generator).

+0

Dzięki! Jakie są twoje myśli na temat korzystania z xrange tutaj. –

+2

@majgis: Moje wszystkie środki, tak. W Pythonie 2 użyj xrange, gdy tylko jest to możliwe. Po prostu zwykle używam Pythona 3, więc na moich przykładach napiszę Python 3. – delnan

6

Wiem, że jest stary, ale właśnie znalazłem funkcję findItems(text, Qt.MatchFlags) w QListWidget. Tak więc, aby iteracyjne wszystkie elementy:

#listWidget is a QListWidget full of items 
all_items = listWidget.findItems('', QtCore.Qt.MatchRegExp) 
for item in all_items: 
    print item 

i robić, co trzeba z rzeczą =)

7
items = [] 
for index in xrange(self.listWidget.count()): 
    items.append(self.listWidget.item(index)) 
7

Wystarczy dodać moje 2 centów, jak szukałem to:

itemsTextList = [str(listWidget.item(i).text()) for i in range(listWidget.count())]