PySide6 QListWidget勾选框与项选中状态同步异常问题求助
QListWidget内置勾选框与选中状态同步异常问题求助
实现点击QListWidget内置勾选框选中对应项的功能时,出现状态同步不一致的问题,运行效果如下:
现象示例:点击「apple」的勾选框时,预期apple对应项会被选中,但偶尔会出现「orange」项被误取消选中的情况,功能表现不稳定无规律。已查阅所有相关讨论帖,均未找到可行解决方案。
运行环境
- Mac Big Sur
- Python 3.7.9
- PySide6 6.2.0
最小可复现代码
from PySide6.QtCore import * from PySide6.QtGui import * from PySide6.QtWidgets import * import sys class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("My App") self.list = QListWidget(self) self.list.setIconSize(QSize(12, 12)) self.list.setSelectionMode(QAbstractItemView.MultiSelection) self.list.itemSelectionChanged.connect( self.on_selection_changed) self.list.itemChanged.connect(self.on_checkbox_clicked) # Set the central widget of the Window. self.setCentralWidget(self.list) for sheet in ['apple', 'orange', 'banana', 'pearl']: item = QListWidgetItem(sheet) self.list.addItem(item) item.setFlags(item.flags() | Qt.ItemIsUserCheckable) item.setCheckState(Qt.Unchecked) def on_checkbox_clicked(self, item): print(item.text()) print(item.checkState()) if item.checkState() is Qt.CheckState.Checked: item.setSelected(True) # self.list.setCurrentItem( # item, QItemSelectionModel.Select) print(f'select: {item.text()}') else: item.setSelected(False) # self.list.setCurrentItem( # item, QItemSelectionModel.Deselect) print(f'unselect: {item.text()}') def on_selection_changed(self): self.list.blockSignals(True) for index in range(self.list.count()): item = self.list.item(index) if item.isSelected(): item.setCheckState(Qt.CheckState.Checked) elif not item.isSelected(): item.setCheckState(Qt.CheckState.Unchecked) self.list.blockSignals(False) app = QApplication(sys.argv) window = MainWindow() window.show() app.exec()
替代解决方案
经过验证,最终找到了实现成本更低的替代方案,核心代码如下,供后续有需要的开发者参考:
listwidget = QListWidget() listwidget.setSelectionMode(QAbstractItemView.MultiSelection) listwidget.itemSelectionChanged.connect(self.on_selection_changed) def on_selection_changed() for index in range(listwidget.count()): item = listwidget.item(index) if item.isSelected(): item.setIcon(QIcon("path/to/your/check_icon.png")) else: item.setIcon(QIcon("path/to/your/uncheck_icon.png"))
内容的提问来源于stack exchange,提问作者Gaz Zhao
相关产品推荐
相关产品推荐

