PySide6 QTreeView自动化测试:模拟选中与获取当前项问题
PySide6 QTreeView 自动化测试问题解答
问题1:如何以对应用程序其余部分透明的方式模拟树视图中新项的选中?直接从测试代码调用PyProto.currentChanged()是否可行?
- 直接调用
PyProto.currentChanged()不可行。这个方法只是槽函数,手动调用仅会执行槽内的业务逻辑,但不会更新树视图的选择模型状态、焦点状态,也无法触发其他依赖选择状态的组件更新,相当于只走了部分逻辑,没有模拟真实选中的完整流程,对程序其他部分不透明。 - 正确的做法是通过树视图的选择模型模拟真实选中:
- 获取树视图的选择模型:
selection_model = tree_view.selectionModel() - 获取目标项的
QModelIndex(可通过模型的index()方法生成,比如target_index = tree_view.model().index(row, column, parent_index)) - 调用选择模型的
setCurrentIndex方法:selection_model.setCurrentIndex(target_index, Qt.ItemSelectionModel.SelectCurrent | Qt.ItemSelectionModel.Rows)
该操作会自动触发currentChanged信号,同步更新视图的选中状态、焦点,和用户手动点击的效果完全一致,对程序其余部分完全透明。
- 获取树视图的选择模型:
问题2:如何获取树视图中的当前项列表,以便调用currentChanged()?
- 获取当前选中项分两种场景:
- 获取单个当前项(拥有焦点的选中项):直接调用树视图的
currentIndex()方法,返回对应的QModelIndex。 - 获取所有选中项列表:
- 获取所有选中的单元格索引:
selected_indexes = tree_view.selectionModel().selectedIndexes() - 获取选中的整行(去重后的行级索引):
selected_rows = tree_view.selectionModel().selectedRows()
- 获取所有选中的单元格索引:
- 获取单个当前项(拥有焦点的选中项):直接调用树视图的
- 注意:如果是为了触发
currentChanged逻辑,无需手动调用该槽函数,按问题1的方法调用setCurrentIndex就会自动触发信号并执行槽逻辑。若确实需要手动传参调用,需传入新的当前索引和之前的当前索引,比如tree_view.currentChanged(new_index, old_index),但这种方式会跳过选择模型的状态更新,不推荐使用。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

