如何让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
相关产品推荐
相关产品推荐

