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

PySide6中QTableView结合Pandas高亮指定行的问题

问题分析

你遇到的核心问题是排序后DataFrame的原索引和模型显示的行号不匹配:

  • 对idx_df按CarIdxPosition排序后得到self.idx_data,此时DataFrame的原行索引(对应初始的PlayerIDX行)和模型中显示的连续行号已经脱节。
  • 直接调用highlight_player_row(30)是把原DataFrame的索引30当成了模型的行号,但排序后PlayerIDX=30的行在模型里的实际位置是第25位(对应行号24,因为模型行从0开始计数),所以高亮了错误的行。
解决方案

不需要回到数据生成阶段,只需要在排序后的DataFrame中找到PlayerIDX=30对应的模型行号,再调用高亮函数即可:

  1. 定位目标行的模型行号
# 在排序后的self.idx_data中筛选PlayerIDX=30的行
mask = self.idx_data['PlayerIDX'] == 30
if mask.any():
    # 获取该行在排序后DataFrame中的原索引
    target_original_idx = self.idx_data[mask].index[0]
    # 将原索引转换为模型使用的连续行号
    target_row_in_model = self.idx_data.index.get_loc(target_original_idx)
    # 调用高亮函数
    self.highlight_player_row(target_row_in_model)
  1. 优化高亮函数(可选,减少冗余操作)
    不需要循环每一列单独发送信号,直接发送整行的变更信号即可:
def highlight_player_row(self, row):
    # 给整行所有列设置背景色
    for column in range(self.columnCount()):
        self.colors[(row, column)] = QBrush(Qt.darkCyan)
    # 发送整行的数据变更信号
    start_idx = self.index(row, 0)
    end_idx = self.index(row, self.columnCount() - 1)
    self.dataChanged.emit(start_idx, end_idx, (Qt.BackgroundRole,))
额外简化技巧

如果希望后续操作更直观,可以在排序后重置DataFrame的索引:

self.idx_data = idx_df.sort_values(by=['CarIdxPosition']).reset_index(drop=True)

此时排序后的DataFrame行索引就是从0开始的连续数字,定位目标行可以简化为:

target_row_in_model = self.idx_data[self.idx_data['PlayerIDX'] == 30].index[0]

内容的提问来源于stack exchange,提问作者Byte Insight

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:01:05