从 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 中的原始索引的主要内容,如果未能解决你的问题,请参考以下文章

如何从QTableView的选定行获取值?

如何从QTableView中获取选定的行数

PyQt4中的QTableView选定元素

QTableView 的 selectedItems 中选定行/行的顺序

QTableView 没有行区的信号

如何从 QTableView 获取活动/选定的 QRadioButton