PyQt4:如何迭代QListWidget中的所有项目

M J*_*M J 21 python qlistwidget pyqt4

目前,我在继承QtGui.QListWidget的类中使用以下while循环来迭代所有项:

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

        i += 1
Run Code Online (Sandbox Code Playgroud)

我希望我可以使用:

for item in self.items():
Run Code Online (Sandbox Code Playgroud)

但是items()方法需要一个QMimeData对象,我不知道如何构造以返回所有项目.是否有比上面的while循环更清晰的方法?

小智 18

我不知道MIME类型是什么,我也找不到方便的方法.但你可以编写一个这样的简单方法并完成:

def iterAllItems(self):
    for i in range(self.count()):
        yield self.item(i)
Run Code Online (Sandbox Code Playgroud)

它甚至是懒惰的(发电机).

  • @majgis:我的意思是,是的.在Python 2中,尽可能使用xrange.只是我通常使用Python 3,所以我倾向于在我的例子中编写Python 3. (2认同)

Pyt*_*nic 12

只是为了增加我的2美分,我正在寻找这个:

itemsTextList =  [str(listWidget.item(i).text()) for i in range(listWidget.count())]
Run Code Online (Sandbox Code Playgroud)


Die*_*ano 9

我知道这是旧的,但我刚刚在QListWidget中找到了一个函数findItems(text,Qt.MatchFlags).所以,迭代所有项目:

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

并使用item =)做任何你需要的事情

  • 您还可以在此处找到其他Qt.MatchFlag参数:http://pyqt.sourceforge.net/Docs/PyQt4/qt.html#MatchFlag-enum (2认同)

sam*_*sam 7

items = []
for index in xrange(self.listWidget.count()):
     items.append(self.listWidget.item(index))
Run Code Online (Sandbox Code Playgroud)


Cos*_*ead 5

正如其他人在这里寻求有关 PyQt5 的相同信息的说明一样,这里略有不同。

正如上面针对 PyQt4 的用户Pythonic所述,您仍然可以使用以下方法直接索引项目:

item_at_index_n = list_widget.item(n)
Run Code Online (Sandbox Code Playgroud)

但是要获取用于迭代的项目列表,使用空字符串和 MatchRegExp 标志似乎不再起作用。

在 PyQt5 中执行此操作的一种方法是:

all_items = list_widget.findItems('*', PyQt5.Qt.MatchWildcard)
Run Code Online (Sandbox Code Playgroud)

我仍在掌握 PyQt,所以很可能有一种更简单/更简单/更优雅的方式,我只是还没有遇到过。但我希望这会有所帮助!