PySide6的listWidget控件的selected 与checked状态不能混淆,是两个不同概念。
下面两个方法实现,一次批量删除listWidget控件中的多个项目,对第一个方面的理解:
这句代码:items = self.list_widget.findItems("", QtCore.Qt.MatchContains)
是使用 QListWidget
的 findItems()
方法来查找符合特定条件的项目。
具体来说,findItems()
方法用于在 QListWidget
中搜索包含特定文本的项目。这个方法接受两个参数:
- 第一个参数是要搜索的字符串。
- 第二个参数是匹配模式,定义了如何进行搜索。
在这句代码中,第一个参数是一个空字符串 ""
,这意味着它将匹配所有项目,因为所有项目都可以包含空字符串。
第二个参数是 QtCore.Qt.MatchContains
,这是一个标志,表示在搜索时只要项目文本包含第一个参数指定的字符串,就认为该项目符合条件。
因此,这句代码的作用是查找 list_widget
中的所有项目,无论它们的内容如何,因为每个项目都可以包含空字符串。然后,这些项目被保存在 items
列表中。
然而,这种搜索方式实际上不是获取所有项目的最佳方法,因为它基于文本匹配而非直接获取所有项目。更直接的方式是使用 count()
和 item(index)
方法来遍历所有项目,如之前所提到的。这样可以避免潜在的混淆和误解。
第二个逻辑更清晰,需要注意从后向前遍历,把符合条件的进行删除。因为每次删除,listWidget控件就会更新一遍所有项目的索引。
完整代码:
import sys from PySide6 import QtWidgets, QtCore, QtGui class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("批量删除选中项目") self.setGeometry(100, 100, 400, 300) central_widget = QtWidgets.QWidget() self.setCentralWidget(central_widget) layout = QtWidgets.QVBoxLayout(central_widget) self.list_widget = QtWidgets.QListWidget() for i in range(10): item = QtWidgets.QListWidgetItem(f"Item {i}") self.list_widget.addItem(item) item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) item.setCheckState(QtCore.Qt.Unchecked) layout.addWidget(self.list_widget) self.delete_button = QtWidgets.QPushButton("删除选中的项目") self.delete_button.clicked.connect(self.delete_checked_items) layout.addWidget(self.delete_button) # 方法一:可以实现 def delete_checked_items(self): items = self.list_widget.findItems("", QtCore.Qt.MatchContains) for item in items: if item.checkState() == QtCore.Qt.Checked: self.list_widget.takeItem(self.list_widget.row(item)) # 方法二:可以实现 # def delete_checked_items(self): # count = self.list_widget.count() # for i in range(count - 1, -1, -1): # 从后往前遍历,删除项目不会影响未遍历到的索引 # item = self.list_widget.item(i) # if item is not None and item.checkState() == QtCore.Qt.Checked: # self.list_widget.takeItem(self.list_widget.row(item)) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())