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
相关产品推荐
相关产品推荐

