data analytics
data analytics

Reputation: 26

TableView not editable

Why the TableView in this code isn't editable. I tried to set editTriggers to AllEditTriggers value but it didn't work :

import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import Qt

class TableModel(QtCore.QAbstractTableModel):
    def __init__(self, data):
        super(TableModel, self).__init__()
        self._data = data
    def data(self, index, role):
        if role ==  Qt.DisplayRole:
            return self._data[index.row()][index.column()]
    def rowCount(self, index):
        return len(self._data)
    def columnCount(self, index):
        return len(self._data[0])


app = QtWidgets.QApplication(sys.argv)
table = QtWidgets.QTableView()
table.move(200,200)
table.setFixedSize(500,300)

data = [
[3, 5, 2],
[1, 0, 0],
[3, 8, 0],
[3, 3, 2],
[7, 8, 9],
]

model = TableModel(data)
table.setModel(model)
table.show()
app.exec_()

Upvotes: 0

Views: 541

Answers (1)

eyllanesc
eyllanesc

Reputation: 243897

A default model is not editable, to make it editable you have to add the Qt::ItemIsEditable flag in the flags() method, in addition to implementing the setData() method that implements the change.

class TableModel(QAbstractTableModel):
    def __init__(self, data):
        super(TableModel, self).__init__()
        self._data = data

    def rowCount(self, parent=QModelIndex()):
        return len(self._data)

    def columnCount(self, parent=QModelIndex()):
        return len(self._data[0])

    def data(self, index, role=Qt.DisplayRole):
        if role == Qt.DisplayRole:
            return self._data[index.row()][index.column()]

    def setData(self, index, value, role=Qt.EditRole):
        if role in (Qt.DisplayRole, Qt.EditRole):
            self._data[index.row()][index.column()] = value
            self.dataChanged.emit(index, index)
        return True

    def flags(self, index):
        return super().flags(index) | Qt.ItemIsEditable

Upvotes: 1

Related Questions