Введите данные в qTableview, используя QAbstractTableModel / Delegate - PullRequest
0 голосов
/ 03 марта 2020

В жизни я не могу понять, как редактировать ячейку в 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
...