QTableWidget setSelectionModel报错:选择模型与视图模型不匹配如何解决
问题原因
Qt所有基于QAbstractItemView的视图类(包括QTableWidget)有明确校验规则:调用setSelectionModel()传入的选择模型,必须和视图当前绑定的数据模型为同一个实例,否则就会抛出你看到的报错。
你的代码里创建QItemSelectionModel时用了无参构造,这个新生成的选择模型没有关联任何数据模型;而QTableWidget初始化时会自动创建一个内置的私有数据模型供自身存储表格数据,你传入的空构造选择模型和视图持有的数据模型完全不匹配,自然会触发设置失败的提示。
补充说明:QTableWidget初始化时会自动生成适配自身内置模型的默认选择模型,绝大多数业务场景下不需要手动新建选择模型,直接调用self.plotTW.selectionModel()就能拿到可用的实例,完全能满足行选、列选、选中状态监听等常规需求。
修复方法
如果确实因为自定义选择逻辑需要手动替换选择模型,创建QItemSelectionModel实例时必须传入两个参数:
- 视图当前绑定的数据模型,通过视图的
model()方法直接获取即可 - 父对象指针,一般直接传入对应的QTableWidget实例,避免Qt对象内存泄漏
修正后的setSelectionModel方法实现如下:
def setSelectionModel(self): # 构造选择模型时绑定视图的当前模型,同时指定父对象 custom_selection_model = QtCore.QItemSelectionModel(self.plotTW.model(), self.plotTW) self.plotTW.setSelectionModel(custom_selection_model)
如果没有特殊的自定义选择需求,直接删掉手动创建选择模型的代码即可,默认生成的选择模型完全能支撑你代码里的行选设置、选中信号监听逻辑,不会出现任何兼容问题。
内容的提问来源于stack exchange,提问作者Nixcc
相关产品推荐
相关产品推荐

