遍历QTableView行

时间:2018-12-01 05:12:59

标签: python pyqt pyqt4 qstandarditemmodel

我有一个QTableView,它显示模型中特定QModelIndex的子项(它具有分层数据,表当然不能显示)。我希望能够遍历表视图中的所有项目,即rootIndex的所有子项。我如何有效地做到这一点?我使用table.rootIndex()引用了父索引,但是在不迭代整个子模型的情况下,我看不到任何迭代索引子代的方法,这似乎是错误的。

这是QSortFilterProxyModel的工作,用于在表中安装模型的子集吗?我刚才说的话还说得通吗?!

这里是启动和运行的快速示例

class Sample(QtGui.QDialog):
    def __init__(self):
    super(Sample, self).__init__()
        model = QtGui.QStandardItemModel(self)

        parent_index1 = QtGui.QStandardItemModel("Parent1")
        model.appendRow(parent_index1)

        parent_index2 = QtGui.QStandardItemModel("Parent2")
        model.appendRow(parent_index2)

        one = QtGui.QStandardItem("One")
        two = QtGui.QStandardItem("Two")
        three = QtGui.QStandardItem("Three")

        parent_index1.appendRows([one, two, three])

        table = QtGui.QTableView(self)
        table.setModel(model)
        table.setRootIndex(model.index(0,0))

        # okay now how would I loop over all 'visible' rows in the table? (children of parent_index1)

2 个答案:

答案 0 :(得分:0)

好吧,我觉得很蠢,我弄明白了。忘了model.index()允许您指定父母...我想那里的其他可怜人可能会像我以前一样困惑,所以在这里您可以这样做:

for row in range(self.model.rowCount(self.table.rootIndex())):
    child_index = self.model.index(row, 0, self.table.rootIndex())) # for column 0

答案 1 :(得分:0)

以下是通过QTableView进行迭代的两种方法:

假设table_view是对QTableView接口对象的引用,并且已经填充了项目。如果用户已经选择/单击了项目,则可以通过以下方式对其进行迭代:

for item in table_view.selectedIndexes():
    #whatever you want to do with the data in that cell is now up to you
    table_cell_value = item.data()
    print(table_cell_value)

但是,如果用户没有选择任何内容,但是您想要遍历表中的所有项目,则只需进行一次小调整:

table_view.selectAll()
#this selects all the indexes so you can now iterate over them using the same method as above.
for item in table_view.selectedIndexes():
    table_cell_value = item.data()
    print(table_cell_value)