Как установить данные в ячейке QtableView с помощью pyside

Я пытаюсь установить значение в ячейке в моем QtableView. Я использую Pyside2.

class TableModel(QtCore.QAbstractTableModel):

    def __init__(self, mlist=None):
        super(TableModel, self).__init__()
        self._items = [] if mlist == None else mlist
        self._header = []

    def data(self, index, role = QtCore.Qt.DisplayRole):
        if not index.isValid():
           return None
        if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
            return self._items[index.row()][index.column()]
        return None

    def setData(self, index, value, role = QtCore.Qt.EditRole):
        if value is not None and role == QtCore.Qt.EditRole:
            self._items[index.row()][index.column()] = value
            return True
        return False

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
 # skip the irrelevant code #
    Table = QTableView()
    model = TableModel()
    Table.setModel(model)
    row, column = a_function_that_outputs_the_row_and_column_of_the_cell_to_edit()

    self.Table.model().setData(index ?, value)

С чем я борюсь, так это понять, как передать индекс в качестве аргумента, у меня есть строка и столбец, любая помощь в том, как это сделать правильно?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
1 840
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно использовать model.index(row, column, parent=None) (см. документацию ), чтобы получить соответствующий QModelIndex.
Если модель двумерная (не древовидная), родитель не требуется:

model.setData(model.index(row, column), value)

Спасибо ! Кажется, это решает проблему, однако данные моей ячейки не меняются. Я добавил строку: Table.model().dataChanged.emit() после строки setData, ничего не понял, пожалуйста? еще раз спасибо

Hamouza 09.12.2020 16:43

@Hamouza Это модель, которая должна посылать сигнал, поэтому вы должны добавить self.dataChanged.emit(index, index) перед return True в модели.

musicamante 09.12.2020 16:48

Вот мой результат отладки: я добавил строку print(row, column) перед строкой Table.model().setData(Table.model().index(row, column), value) в классе Mainwindow, она печатает правильную строку и столбец . Затем в setData я добавил print('setting ', value, ' in ', index.row(), ' ', index.column()) перед self._items[index.row()][index.column() ] = значение, и здесь он показывает мне, что index.row = -1 и index.column = -1, так что это источник проблемы. Я не понимаю, почему, поскольку моя строка и столбец, которые передаются в setdata, верны. Я думаю, что это как-то связано с индексом.

Hamouza 09.12.2020 16:53

В коде в вашем вопросе отсутствуют как rowCount(), так и columnCount(), вы их реализовали?

musicamante 09.12.2020 17:13

да, я реализовал их. Я решил эту ошибку, создав индекс, используя QAbstractItemModel::createIndex вместо QAbstractItemModel::index. Я не знаю, почему то, что вы предложили, не сработало для моего случая. Еще раз спасибо @musicamante

Hamouza 09.12.2020 17:16

Без минимальных, но все же полностью воспроизводимых примеров трудно помочь точно. Для дальнейшего использования всегда убедитесь, что вы включили весь необходимый код, особенно для сложных объектов, таких как модели данных: мы не можем «угадать», что вы сделали в своем коде, но просто отсутствовали в примере, и комментировать потоки с «Вы сделали это?» /"да, но я не привел пример" не очень полезны. Никогда не спешите публиковать вопрос: убедитесь, что он хорош, и, если его код нужно запустить, попробуйте сделать это самостоятельно: если вы не можете его воспроизвести, мы тоже не сможем.

musicamante 09.12.2020 17:33

Другие вопросы по теме