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

PyQt6 QTableView如何在选中行时触发方法并获取行号

QTableView捕获选中行号的两种解决方案

方法一:利用SelectionModel的信号(推荐)

QTableView本身没有cellClicked信号,但可以通过其内置的selectionModel()获取选择模型,利用选择模型的信号监听行选中变化。这种方式既支持鼠标点击,也支持键盘导航切换选中行,是更符合Qt设计理念的实现方式。

修改UI类的初始化代码,添加信号连接:

def __init__(self):
    super().__init__()
    uic.loadUi('model.ui', self)

    data = [[4, 9, 2], [1, 0, 0], [3, 5, 0], [3, 3, 2], [7, 8, 9]]
    self.model = TableModel(data)
    self.tableView.setModel(self.model)
    
    # 连接currentRowChanged信号到自定义槽函数
    self.tableView.selectionModel().currentRowChanged.connect(self.on_row_selected)

添加对应的槽函数:

def on_row_selected(self, current_index, previous_index):
    # current_index包含当前选中行的索引,直接获取行号
    print(current_index.row())

如果需要监听多选的选中范围变化,可改用selectionChanged信号:

self.tableView.selectionModel().selectionChanged.connect(self.on_selection_changed)

def on_selection_changed(self, selected, deselected):
    # 获取所有选中的行号(自动去重)
    selected_rows = set(index.row() for index in selected.indexes())
    if selected_rows:
        print("选中行号:", selected_rows)

方法二:修复事件过滤器

你之前的事件过滤器未生效,是因为QTableView的鼠标点击事件实际由其内部的viewport()部件处理,而非TableView本身。修改事件过滤器的判断条件即可:

def eventFilter(self, source, event):
    # 监听viewport的鼠标点击事件
    if event.type() == event.Type.MouseButtonPress and source == self.tableView.viewport():
        self.selected_row()
    return super().eventFilter(source, event)

注意:这种方法仅能捕获鼠标点击触发的选中,通过键盘切换选中行不会触发该事件,因此更推荐使用第一种方法。

内容的提问来源于stack exchange,提问作者Jack Zero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:05:24