В жизни я не могу понять, как редактировать ячейку в qtableview / model. Я попытался настроить делегата, но все примеры довольно неясны. По сути, я хочу иметь возможность щелкнуть ячейку в таблице (ItemisEditable, как было установлено), ввести значение, и таблица сохранит это значение. Спасибо
class pandasModel(QAbstractTableModel):
def __init__(self, data, check_col=[0, 0], edit_cols=None):
QAbstractTableModel.__init__(self)
self._data = data
self._check = check_col
self._edit_cols = edit_cols
cs = 0
if check_col[1]: cs = 2
self._checked = [[cs for i in range(self.columnCount())] for j in range(self.rowCount())]
def rowCount(self, parent=QModelIndex):
return self._data.shape[0]
def columnCount(self, parent=QModelIndex):
return self._data.shape[1]
def data(self, index, role):
if index.isValid():
data = self._data.iloc[index.row(), index.column()]
if role == Qt.DisplayRole or role == Qt.EditRole:
if isinstance(data, float):
return f'{data:,.2f}'
elif isinstance(data, (int, np.int64)):
return f'{data:,}'
else:
return str(data)
elif role == Qt.TextAlignmentRole:
if isinstance(data, (float, int, np.int64)):
return Qt.AlignVCenter + Qt.AlignRight
elif role == Qt.CheckStateRole:
if self._check[0] > 0:
if self._check[0] == index.column():
return self._checked[index.row()][index.column()]
return None
def flags(self, index):
if not index.isValid(): return
if self._edit_cols is not None:
if index.column() in self._edit_cols:
return Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable
else:
return Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsUserCheckable
else:
return Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsUserCheckable
def setData(self, index, value, role, parent=QModelIndex):
if not index.isValid() or role != Qt.CheckStateRole: return False
if role == Qt.CheckStateRole:
self._checked[index.row()][index.column()] = value
if value == 0:
print('checked')
qm.Main.filter_blotter
#elif role == Qt.EditRole:
# self._data.iat[index.row(), index.column()] = index
self.dataChanged.emit(index, index)
return True
def headerData(self, col, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self._data.columns[col]
return None
def setHeader(table, ColResize=False, RowResize=False, Stretch=None):
header = table.horizontalHeader()
stylesheet = "QHeaderView::section {background-color:rgb(230, 240, 243)};"
header.setStyleSheet(stylesheet)
if Stretch is not None:
header.setSectionResizeMode(Stretch, QtWidgets.QHeaderView.Stretch)
if ColResize:
table.resizeColumnsToContents()
if RowResize:
table.resizeRowsToContents()
return
class MyDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self):
QtWidgets.QStyledItemDelegate.__init__(self)
def createEditor(self, parent, option, index):
self.lineEdit = QtWidgets.QLineEdit(parent)
return self.lineEdit