从 QTableView 中的选定行访问 QAbstractTableModel 中的原始索引
Posted
技术标签:
【中文标题】从 QTableView 中的选定行访问 QAbstractTableModel 中的原始索引【英文标题】:Access original index in QAbstractTableModel from selected row in QTableView 【发布时间】:2020-04-17 09:53:26 【问题描述】:我正在使用 Qt5 和 PySide2 为 python 程序实现 GUI。我对 Qt 的 C++ 方面的理解没有问题,所以请随意指出与 python 无关的 Qt 引用。
我有一些数据使用QAbstractTableModel
的子类显示在QTableView
中。我还使用QSortFilterProxyModel
的子类来过滤我的表以仅显示基础数据的子集,因为它是一个非常大的数据集。我为用户提供了根据某些标准仅显示部分数据的可能性。这一切都非常有效。
然后我已经配置了QTableView
,让用户只能选择完整的行:
self.ui.candidatesTable.setSelectionBehavior(QTableView.SelectRows)
在处理 UI 的对象中,我实现了一个槽,当表格中的选择发生变化时调用它:
@Slot(QItemSelection)
def handleSelectionChanged(self, item):
hasSelection = self.ui.candidatesTable.selectionModel().hasSelection()
if hasSelection:
selectedRows = self.ui.candidatesTable.selectionModel().selectedRows()
for row in selectedRows:
print(row.row())
我的问题是print(row.row())
打印的值显示了当前显示的行中的行索引。如果用户选择了仅显示数千行中的 5 行的过滤条件,然后选择了第一行,print(row.row())
将返回0
,而不是底层QAbstractTableModel
中的原始索引。
因此,我的问题如下:在这种情况下如何访问原始索引?
【问题讨论】:
【参考方案1】:您必须使用 mapToSource() 方法将代理模型的 QModelIndex 映射到源模型:
@Slot(QItemSelection)
def handleSelectionChanged(self, item):
indexes = self.ui.candidatesTable.selectedIndexes()
proxy_model = self.ui.candidatesTable.model()
rows = set()
for index in indexes:
si = proxy_model.mapToSource(index)
rows.add(si.row())
for row in rows:
print(row)
【讨论】:
【参考方案2】:基于@eyllanesc 之前的回答,我使用selectedRows()
而不是selectedIndexes()
实现了一个解决方案。后者返回所有选定列和行的索引,而我只对行感兴趣:
@Slot(QItemSelection)
def handleSelectionChanged(self, item):
hasSelection = self.ui.candidatesTable.selectionModel().hasSelection()
if hasSelection:
selectedRows = self.ui.candidatesTable.selectionModel().selectedRows()
for row in selectedRows:
proxy_model = self.ui.candidatesTable.model()
row_index = proxy_model.mapToSource(row).row()
【讨论】:
以上是关于从 QTableView 中的选定行访问 QAbstractTableModel 中的原始索引的主要内容,如果未能解决你的问题,请参考以下文章