Я пытаюсь установить значение в ячейке в моем 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)
С чем я борюсь, так это понять, как передать индекс в качестве аргумента, у меня есть строка и столбец, любая помощь в том, как это сделать правильно?






Вам нужно использовать model.index(row, column, parent=None) (см. документацию ), чтобы получить соответствующий QModelIndex.
Если модель двумерная (не древовидная), родитель не требуется:
model.setData(model.index(row, column), value)
@Hamouza Это модель, которая должна посылать сигнал, поэтому вы должны добавить self.dataChanged.emit(index, index) перед return True в модели.
Вот мой результат отладки: я добавил строку 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, верны. Я думаю, что это как-то связано с индексом.
В коде в вашем вопросе отсутствуют как rowCount(), так и columnCount(), вы их реализовали?
да, я реализовал их. Я решил эту ошибку, создав индекс, используя QAbstractItemModel::createIndex вместо QAbstractItemModel::index. Я не знаю, почему то, что вы предложили, не сработало для моего случая. Еще раз спасибо @musicamante
Без минимальных, но все же полностью воспроизводимых примеров трудно помочь точно. Для дальнейшего использования всегда убедитесь, что вы включили весь необходимый код, особенно для сложных объектов, таких как модели данных: мы не можем «угадать», что вы сделали в своем коде, но просто отсутствовали в примере, и комментировать потоки с «Вы сделали это?» /"да, но я не привел пример" не очень полезны. Никогда не спешите публиковать вопрос: убедитесь, что он хорош, и, если его код нужно запустить, попробуйте сделать это самостоятельно: если вы не можете его воспроизвести, мы тоже не сможем.
Спасибо ! Кажется, это решает проблему, однако данные моей ячейки не меняются. Я добавил строку: Table.model().dataChanged.emit() после строки setData, ничего не понял, пожалуйста? еще раз спасибо