You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySide6 QTableView最后一行获取行号返回-1引发段错误求助

问题分析与解决方法

核心问题

  1. 对rowAt()返回值的误解:你误以为QTableView.rowAt()返回的行号比模型行号大1(因为表头存在),但实际上该方法返回的就是模型的0起始行号——当鼠标落在表头区域时返回-1,落在数据行则返回对应模型行号。原代码中row-1的操作会导致取到错误的行,而最后一行出现row=-1时,row-1=-2会创建无效的QModelIndex,直接引发崩溃。
  2. 事件坐标不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:48:33