K
You need to redesign the method. setData♪ Try the following example:import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class TableModel(QAbstractTableModel):
def init(self, tasks, parent=None): # +++
super(TableModel, self).init(parent)
self.tasks = tasks # +++
def rowCount(self, parent=None, *args, **kwargs):
return len(self.tasks)
def columnCount(self, parent=None, *args, **kwargs):
return 7
def data(self, index, role=None):
if role == Qt.DisplayRole:
row = index.row()
column = index.column()
if column == 0:
return self.tasks[row]#.title
elif column == 1:
return self.tasks[row]#.start_date.toString()
elif column == 2:
return self.tasks[row]#.end_date.toString()
elif column == 3:
return self.tasks[row]#.man_hours
elif column == 4:
return self.tasks[row]#.task_type
elif column == 5:
return self.tasks[row]#.done
return None
def headerData(self, section, orientation, role=None):
if role == QtCore.Qt.DisplayRole:
if orientation == QtCore.Qt.Horizontal:
return ["Задача", "Дата начала", "Дата конца",
"Отдел", "Количество человек", "Трудоёмкость",
"Выполнение"][section]
def setData(self, index, tasks, role): # <--- # +++
if role == Qt.EditRole:
row = index.row()
#column = index.column()
self.tasks[row] = tasks[row]
return True
return False
class MainWindow(QMainWindow):
def init(self):
super().init()
tasks = ["1a","2a","3a","4a","5a","6a"] # Начальное заполнение
self.model = TableModel(tasks)
self.table = QTableView()
self.table.verticalHeader().hide()
self.table.setAlternatingRowColors(True)
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.table.setModel(self.model)
btn = QPushButton("Click me")
btn.clicked.connect(self.btnClicked)
centralWidget = QWidget()
self.setCentralWidget(centralWidget)
grid = QGridLayout(centralWidget)
grid.addWidget(self.table, 0, 0)
grid.addWidget(btn, 1, 0)
def btnClicked(self):
rows = self.model.rowCount()
for row in range(rows):
self.model.setData(self.model.index(row, 0),
["21a","22a","23a","24a","25a","26a"], # +++
Qt.EditRole)
self.table.resizeColumnsToContents()
if name == 'main':
app = QApplication(sys.argv)
mw = MainWindow()
mw.show()
mw.setGeometry(400, 100, 550, 300)
sys.exit(app.exec_())
UpdateEducated models should be implemented setData() and flags()to return the meaning,
containing Qt::ItemIsEditable♪bool QAbstractItemModel:setData(const QModelIndex &index, const QVariant "value, int role = Qt:EditRole)Sets a role for the index element.
If successful, returns true; otherwise returns false.Realizing the basic class is returning false.
For edited models, this function and data(s) need to be reused.Qt:ItemFlags QAbstractTableModel:flags(const QModelIndex 'index) constReorder: QAbstractItemModel::flags(const QModelIndex "index) const.import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class TableModel(QAbstractTableModel):
def init(self, parent=None):
super(TableModel, self).init(parent)
self.tasks = [[['%d - %d' % (i, j), False] for j in range(7)] for i in range(10)] # +++
def rowCount(self, parent=None, *args, **kwargs):
return len(self.tasks)
def columnCount(self, parent=None, *args, **kwargs):
return 7
def headerData(self, section, orientation, role=None):
if role == QtCore.Qt.DisplayRole:
if orientation == QtCore.Qt.Horizontal:
return ["Задача", "Дата начала", "Дата конца",
"Отдел", "Кол-во человек", "Трудоёмкость",
"Выполнение"][section]
def data(self, index, role):
if index.isValid():
data, changed = self.tasks[index.row()][index.column()]
if role in [Qt.DisplayRole, Qt.EditRole]:
return data
def setData(self, index, value, role): # !!!
if role == Qt.EditRole:
self.tasks[index.row()][index.column()] = [value, True]
return True
return False
def flags(self, index): # !!!
return Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable
class MainWindow(QMainWindow):
def init(self):
super().init()
self.model = TableModel()
self.table = QTableView()
self.table.verticalHeader().hide()
self.table.setAlternatingRowColors(True)
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.table.setModel(self.model)
centralWidget = QWidget()
self.setCentralWidget(centralWidget)
grid = QGridLayout(centralWidget)
grid.addWidget(self.table, 0, 0)
if name == 'main':
app = QApplication(sys.argv)
mw = MainWindow()
mw.resize(750, 300)
mw.show()
sys.exit(app.exec_())