Get row and column when checkbox clicked in QtableView

280 Views Asked by At

I have a QtableView with data from a file. I added 3 columns with checkboxes, but now I need to know what checkbox is clicked (Row, column, data). This is working for the cell itself but when clicking the checkbox it gives the latest data or if no data it's -1 and None.

I tried to remove a lot of code so I hope this is not to much or to less.

self.model = TableModel([headers, newRows])
self.proxy_model.setSourceModel(self.model)
self.tableView.setModel(self.proxy_model)


self.tableView.clicked.connect(self.cellClicked)

def cellClicked(self):
    try:
        index = self.tableView.selectionModel().currentIndex()
        row = index.row()
        col = index.column()
        data = index.data()
        # print(index.sibling(row,col).data())
        if isinstance(data, QtWidgets.QCheckBox):
            print(f'Child: {index.child.row()}')
            data = data.text()
            print(data.isChecked())
        print(f'Row:\t{row}\nColumn:\t{col}\nData:\t{data}\n')
    except Exception as e:
        print(e)

class TableModel(QAbstractTableModel):
    def __init__(self, data):
        super().__init__()
        self.checks = {}

        self.headers = data[0]
        self.rows = data[1]
        
    def data(self, index, role):
        try:
            if role == Qt.ItemDataRole.DisplayRole or role == Qt.ItemDataRole.EditRole:
                return self.rows[index.row()][index.column()]
            elif role == Qt.ItemDataRole.CheckStateRole and (index.column() == 0 or index.column() == 6 or index.column() == 7):
                return self.checkState(QPersistentModelIndex(index))

    def setData(self, index, value, role = Qt.ItemDataRole.EditRole):
        if value is not None and role == Qt.ItemDataRole.EditRole:
            self.rows[index.row()][index.column()] = value
            # self.dataChanged.emit(index, index)
            return True
        elif not index.isValid():
            return False
        elif role == Qt.ItemDataRole.CheckStateRole:
            self.checks[QPersistentModelIndex(index)] = value
            return True
        return False

    def checkState(self, index):
        if index in self.checks.keys():
            return self.checks[index]
        else:
            return Qt.CheckState.Unchecked

    def flags(self, index):
        col = index.column()
        if col == 0 or col == 6 or col == 7:
            return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsEditable | Qt.ItemFlag.ItemIsUserCheckable
        else:
            return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEditable
0

There are 0 best solutions below