pyqt :显示 QListWidget 中存在的所有值作为用户选择的



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

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

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

有人可以帮助我了解如何做到这一点吗?

使用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_())

据我了解,您要实现一个选择所有项的函数,解决方案是使用setSelected()QListWidget方法进行迭代,如下所示:

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_())

最新更新