PySide6 QTableView最后一行获取行号返回-1引发段错误求助
问题分析与解决方法
核心问题
- 对
rowAt()返回值的误解:你误以为QTableView.rowAt()返回的行号比模型行号大1(因为表头存在),但实际上该方法返回的就是模型的0起始行号——当鼠标落在表头区域时返回-1,落在数据行则返回对应模型行号。原代码中row-1的操作会导致取到错误的行,而最后一行出现row=-1时,row-1=-2会创建无效的QModelIndex,直接引发崩溃。 - 事件坐标不匹配:
QEvent.ToolTip的pos()是相对于接收事件的Widget(如QTableView本身)的坐标,但rowAt()和columnAt()需要的是**视口(viewport)**的相对坐标,坐标不匹配可能导致最后一行的位置检测失败,返回-1。
修正后的代码
def eventFilter(self, watched, e): if e.type() == QEvent.ToolTip: # 将ToolTip事件的全局坐标转换为视口的相对坐标 pos_in_viewport = self.table.viewport().mapFromGlobal(e.globalPos()) row = self.table.rowAt(pos_in_viewport.y()) col = self.table.columnAt(pos_in_viewport.x()) # 行和列的合法性检查,避免无效索引 if 0 <= row < self.model.rowCount() and 0 <= col < self.model.columnCount(): model_index = self.model.index(row, col) # 这里获取单元格内容并设置ToolTip tooltip_text = model_index.data() QToolTip.showText(e.globalPos(), tooltip_text) else: # 不在有效单元格区域,隐藏ToolTip QToolTip.hideText() return True # 已处理该事件 return super().eventFilter(watched, e)
关键修正点
- 坐标转换:通过
mapFromGlobal()将全局坐标转为视口相对坐标,确保位置检测准确。 - 合法性校验:在创建
QModelIndex前检查行、列是否在有效范围内,彻底避免无效索引导致的崩溃。 - 移除错误的行偏移:直接使用
row作为模型行号,无需减1。
内容的提问来源于stack exchange,提问作者fossildoc
相关产品推荐
相关产品推荐

