2011-01-07 11 views
19

Hiện nay, tôi sử dụng vòng lặp while sau trong một lớp kế thừa QtGui.QListWidget để lặp tất cả các mục:PyQt4: Làm thế nào để bạn lặp tất cả các mục trong một QListWidget

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

     i += 1 

Tôi đã hy vọng tôi có thể sử dụng:

for item in self.items(): 

nhưng phương thức items() muốn đối tượng QMimeData mà tôi không biết cách xây dựng để trả về tất cả các mục. Có cách tiếp cận sạch hơn vòng lặp của tôi ở trên không?

Trả lời

18

Tôi cũng không biết nó thuộc loại MIME nào, và tôi cũng không thể tìm được phương thức tiện lợi. Nhưng bạn có thể viết một phương pháp đơn giản như thế này và được thực hiện:

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

Nó thậm chí còn lười (máy phát).

+0

Cảm ơn! Bạn nghĩ gì về việc sử dụng xrange ở đây. –

+2

@majgis: Tất cả các phương tiện của tôi, vâng. Trong Python 2, sử dụng xrange bất cứ khi nào có thể. Nó chỉ là tôi thường sử dụng Python 3, vì vậy tôi có xu hướng viết Python 3 trong ví dụ của tôi. – delnan

6

Tôi biết điều này là cũ nhưng, tôi chỉ phát hiện ra một hàm findItems(text, Qt.MatchFlags) trong QListWidget. Vì vậy, để lặp tất cả các mục:

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

Và làm bất cứ điều gì bạn cần với các item =)

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

Chỉ cần thêm 2 cent của tôi, như tôi đang tìm kiếm này:

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