Filter checked checkboxes

Viewed 15

I try to get all rows with checked ckeckboxes in a QTableView. I tried to do this with QSortFilterProxyModel, but I don't know how to accomplish. Searched a lot op SO, Google, Github, but not found what I need. Can someone please help me further?

This is my table

self.model = TableModel([headers, newRows])        
self.proxy_model = QSortFilterProxyModel()
self.proxy_model.sort(0, Qt.SortOrder.AscendingOrder)
self.proxy_model.setDynamicSortFilter(True)
self.proxy_model.setFilterKeyColumn(-1) # Search all columns.
self.proxy_model.setSourceModel(self.model)
self.proxy_model.setFilterCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive)
self.leSearch.returnPressed.connect(self.searchField)
self.tableView.setModel(self.proxy_model)

And this is my class

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

        if data:
            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):
            elif role == Qt.ItemDataRole.CheckStateRole and (index.column() == 2 or index.column() == 3):
                return self.checkState(QPersistentModelIndex(index))
            return QVariant()
        except Exception as e:
            print(e)

    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
            return True
        elif not index.isValid():
            return False
        elif role == 10 or role == Qt.ItemDataRole.CheckStateRole:
            nextColumn = 3 if index.column() == 2 else 2

            self.checks[QPersistentModelIndex(index)] = value
            if value == 2 or Qt.CheckState.Checked: # Disable other checkbox
                self.checks[QPersistentModelIndex(self.index(index.row(), nextColumn))] = 0
            self.dataChanged.emit(index, self.index(index.row(),nextColumn), (role,))
            # print(f'Checkbox\nRow:\t{index.row()}\nColumn:\t{index.column()}\nNext Column:\t{nextColumn}\nData:\t{index.data()}\n')
            return True
        # return False
        return TableModel.setData(self, index, value, role)

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

Code for the slected checkboxes so far

def showSelected(self, state):
    source_row = 1
    source_parent = self.model.index(1, 5)
    if state == True:
        print('Checked')
    else:
        print('Unchecked')
    self.proxy_model.filterAcceptsRow(source_row, source_parent)
    return True
0 Answers
Related