You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:15:04