QListWidget和多重选择

33 投票
6 回答
58178 浏览
提问于 2025-04-16 06:00

我有一个普通的 QListWidget,已经连接了一些信号和槽,一切都按我预期的工作。我可以更新、获取、清空等等。

但是这个界面不支持多选。

我该怎么为 QListWidget '启用' 多选功能呢?根据我有限的PyQt经验,我知道需要通过子类化来创建一个自定义的 QListWidget,但接下来该怎么做呢?

谷歌给我的都是C++的答案,但我想要的是Python的。

http://www.qtforum.org/article/26320/qlistwidget-multiple-selection.html

http://www.qtcentre.org/threads/11721-QListWidget-multi-selection

6 个回答

14

这是一个示例,展示了如何在列表控件中获取多个被选中的值,前提是这个列表支持多选。

from PyQt5 import QtWidgets, QtCore
class Test(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Test, self).__init__(parent)
        self.layout = QtWidgets.QVBoxLayout()
        self.listWidget = QtWidgets.QListWidget()
        self.listWidget.setSelectionMode(
            QtWidgets.QAbstractItemView.ExtendedSelection
        )
        self.listWidget.setGeometry(QtCore.QRect(10, 10, 211, 291))
        for i in range(10):
            item = QtWidgets.QListWidgetItem("Item %i" % i)
            self.listWidget.addItem(item)
        self.listWidget.itemClicked.connect(self.printItemText)
        self.layout.addWidget(self.listWidget)
        self.setLayout(self.layout)

    def printItemText(self):
        items = self.listWidget.selectedItems()
        x = []
        for i in range(len(items)):
            x.append(str(self.listWidget.selectedItems()[i].text()))

        print (x)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    form = Test()
    form.show()
    app.exec_()

输出结果如下:

这里是图片描述

30

对于PyQT4来说,代码是这样的:

QListWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
36

很遗憾,我不能帮你解决Python特有的语法问题,但你不需要创建任何子类。

在你创建好QListWidget之后,调用setSelectionMode()方法,并传入一种多选模式,可能你需要的是QAbstractItemView::ExtendedSelection。这个模式还有一些不同的变体,你可以看看。

在处理itemSelectionChanged()信号的槽函数里,调用selectedItems()方法,这样可以获取一个QList,里面包含了QListWidgetItem的指针。

撰写回答