QTreeView筛选后无法正确展开节点问题求助(Qt4.8/Python2.7)
这个问题我之前也遇到过!核心原因是你在筛选状态下直接用原来的代理模型索引去展开,但添加子项后代理模型的索引可能没同步,再加上代码里还有个小错误——子项没添加到选中的父节点下,而是加到了根节点,这也会导致展开逻辑混乱。
给你两个关键修复步骤,结合代码修改来看:
1. 修复子项添加的目标错误
你原来的代码里,拿到parent_item后用model.appendRow(file_item),这会把所有子项都加到模型的根节点,而不是选中的父节点下面!必须改成parent_item.appendRow(file_item),这样子项才会正确关联到选中的节点。
2. 解决筛选状态下的展开失效问题
当你在源模型添加子项后,原来的代理模型索引currentindex可能因为筛选规则的重新计算而失效。正确的做法是把源模型的父索引重新映射回代理模型的索引,再执行展开操作。
修改后的update_treeview函数如下:
def update_treeview(self, currentindex, previousindex): # 将代理模型的当前索引映射到源模型 source_model_index = proxymodel.mapToSource(currentindex) parent_item = model.itemFromIndex(source_model_index) # 正确将子项添加到选中的父节点下 for childitem in list_of_children: file_item = QtGui.QStandardItem(str(childitem)) parent_item.appendRow(file_item) # 这里是关键修改 # 把源模型的父索引重新映射回代理模型的索引 proxy_parent_index = proxymodel.mapFromSource(source_model_index) # 展开这个最新的代理索引 treeview.expand(proxy_parent_index)
额外补充两个小细节
- 检查代理模型的
filterKeyColumn设置:默认是0,如果你的节点文本不在第0列,需要手动设置proxymodel.setFilterKeyColumn(0)(替换成对应列号),确保筛选规则作用在正确的列上。 - 信号连接的大小写:Qt4里的信号是
textChanged(QString),不是TextChanged,你原来代码里的QtCore.Signal("TextChanged(QString)")可能是笔误,建议改成QtCore.SIGNAL("textChanged(QString)"),避免信号触发异常。
这样修改后,不管是筛选状态还是未筛选状态,添加子项后都能正确展开对应的节点了。
内容的提问来源于stack exchange,提问作者Man Wa kileleshwa
相关产品推荐
相关产品推荐

