pyqt:向用户显示 QListWidget 中存在的所有值

Posted

技术标签:

【中文标题】pyqt:向用户显示 QListWidget 中存在的所有值【英文标题】:pyqt : Display All values present in QListWidget as selected to user 【发布时间】:2018-10-03 14:39:07 【问题描述】:

我已经搜索了很多,但我找不到这样做的解决方案。

我有一个 QListWidget,它将填充一个值列表。我需要在列表中实现“全选”作为默认行为。

我已经使用了 MultiSelection 并且效果很好,但需要避免单击每个项目,以防用户想要对列出的所有项目进行更新。

有人可以帮助我了解如何执行此操作吗?

【问题讨论】:

您能否更好地解释一下,您期望什么行为?如果你按下一个按钮,你想要选择所有项目吗? 我有 2 个组合框,当我在它们中都选择了值时,一个函数会加载带有值的 QListWidget。但是对于 1 个组合框中的特定值,例如'All_Routes',我希望 QListWidget 有值,但所有值都已选择。 据我了解,您希望组合框中的项目之一是“选择所有内容”,然后您必须自动选择 QListWidget 中的所有项目,如果在选择所有内容后更改组合框项目您必须选择相同的组合框项目吗?组合框项是否与 QListWidget 相同? 您理解正确。不,组合框项目与 QListWidget 项目不同。正如我所说,我有一个函数,它在选择两个组合框项目后调用,然后加载 QListWidget,函数的输出为列表。 从你所说的我知道你希望 QListWidget 有一个“selectAll()”函数,对吗?你能提供一个minimal reproducible example吗? 【参考方案1】:

使用QtWidgets.QAbstractItemView.ExtendedSelection

当用户以通常的方式选择一个项目时,选择被清除并选择新项目。但是,如果用户在单击某个项目时按下 Ctrl 键,则单击的项目将被切换,而所有其他项目都保持不变。如果用户在单击项目时按下 Shift 键,则当前项目和单击项目之间的所有项目都被选中或取消选中,具体取决于单击项目的状态。可以通过将鼠标拖动到多个项目上来选择它们。

import sys
from PyQt5 import QtWidgets

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    w = QtWidgets.QListWidget()
    for i in range(12):
        w.addItem('Item '.format(i))

    w.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)  

    #w.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)  

    w.show()
    sys.exit(app.exec_())

【讨论】:

您好,我不希望用户选择该项目。我想列出 QListWidget 中已选择的所有项目。【参考方案2】:

据我了解,您想要实现一个选择所有项目的功能,解决方案是使用QListWidgetsetSelected() 方法进行迭代,如下所示:

import sys
from PyQt4 import QtCore, QtGui


class ListWidget(QtGui.QListWidget):
    def __init__(self, parent=None):
        super(ListWidget, self).__init__(parent)
        self.setSelectionMode(QtGui.QListWidget.MultiSelection)

    @QtCore.pyqtSlot()
    def selectAll(self):
        for i in range(self.count()):
            it = self.item(i)
            if it is not None:
                it.setSelected(True)

    @QtCore.pyqtSlot()
    def clearSelection(self):
        for i in range(self.count()):
            it = self.item(i)
            if it is not None:
                it.setSelected(False)


class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        lay = QtGui.QVBoxLayout(self)

        button_sel = QtGui.QPushButton("Select All")
        button_unsel = QtGui.QPushButton("Clear Selection")

        self.list_widget = ListWidget()

        for letter in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
            it = QtGui.QListWidgetItem(letter)
            self.list_widget.addItem(it)

        button_sel.clicked.connect(self.list_widget.selectAll)
        button_unsel.clicked.connect(self.list_widget.clearSelection)

        lay.addWidget(button_sel)
        lay.addWidget(button_unsel)
        lay.addWidget(self.list_widget)     


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

【讨论】:

这正是我想要的,但没有按钮点击事件。 @Shoikat 该按钮是可选的,您可以通过以下方式进行选择:self.list_widget.selectAll() @Shoikat 如果我的回答对您有帮助,请不要忘记将其标记为正确,如果您不知道该怎么做,请查看tour,这是感谢 SO 的最佳方式。

以上是关于pyqt:向用户显示 QListWidget 中存在的所有值的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 中 QListWidget 怎么获取 item 中 combox 的当前显示的值

PyQt4:如何获取 QlistWidget 的可见项目列表?

pyqt5 qlistwidget 对大文本数据的性能

如何在两个 QListWidget 之间移动项目?

向 pyqt 列表添加标题

PyQt5 QListWidget自定义项目[重复]