Итерация по строкам QTableView - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть 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 голосов
/ 23 июня 2019

Вот два способа перебора 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)
0 голосов
/ 01 декабря 2018

Хорошо, я чувствую себя глупо, я понял это.Забыл, что 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
...