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

如何让QListView选中项可见?PyQt5项移动后文本不显示问题

解决QListView移动项后文本不显示的问题

嘿,我帮你定位到问题啦!你遇到的已选列表项文本不显示的情况,主要是代码里的两个小问题导致的,咱们来一步步修正:

核心问题分析

  • 每次点击都重建模型:你在Add_Button_click里每次都新建QStandardItemModel并赋值给self.sel_model,这会把之前已经添加到已选列表的内容全部清空,而且新模型和列表的绑定逻辑也有问题
  • 直接移动item的归属:虽然把原模型的item直接append到新模型会让它从原模型移除,但这种方式会导致item的显示状态没有被正确同步到新模型

修正后的代码

def Add_Button_click(self): # Add the available item to the selected box.
    # 先确认已选列表是否已经绑定了模型,没有的话再创建
    if not self.Selected_List.model():
        self.sel_model = QStandardItemModel(self.Selected_List)
        self.Selected_List.setModel(self.sel_model)
    
    # 反向遍历可用列表的项(避免移除item后行数变化导致遍历漏项)
    for index in reversed(range(self.avail_model.rowCount())):
        item = self.avail_model.item(index)
        if item.checkState() == QtCore.Qt.Checked:
            # 先从原模型移除item,再添加到已选模型
            self.avail_model.takeItem(index)
            self.sel_model.appendRow(item)

关键修改点说明

  • 复用已有的模型:不再每次点击都重新创建模型,只有当已选列表还没有模型的时候才初始化并绑定,这样之前添加的内容会被保留下来
  • 反向遍历原列表:因为移除item会让原模型的行数减少,如果正向遍历的话,后面的项会因为索引变化被跳过,反向遍历就能完美避免这个问题
  • 显式管理item的归属:用takeItem先把item从原模型移除,再添加到已选模型,这样item的状态会被正确同步,文本就能正常显示了

额外小建议

如果你希望保留可用列表里的项,只是复制到已选列表(而不是移动),可以改成创建item的副本:

if item.checkState() == QtCore.Qt.Checked:
    # 复制原item的文本和勾选状态
    new_item = QStandardItem(item.text())
    new_item.setCheckState(item.checkState())
    self.sel_model.appendRow(new_item)
    # 不需要移除原项的话,就删掉下面这行
    # self.avail_model.takeItem(index)

这样修改之后,已选列表里的项就能正常显示文本啦!

内容的提问来源于stack exchange,提问作者Tadpole

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:22:14