def createEditor(self, parent, options, index: QModelIndex): model = index.model() # type: EditableTableModel if not model.is_discrete(index.column()): return super().createEditor(parent, options, index) vals = model.discrete_vals(index.column()) edit = QLineEdit(parent) edit.setCompleter(QCompleter(vals, edit, filterMode=Qt.MatchContains)) def save(): if edit.text(): model.setData(index, edit.text()) edit.editingFinished.connect(save) return edit
def data(self, index: QModelIndex, role=None): value = self._table[index.row()][index.column()] if role == Qt.DisplayRole and value is not None: return str(value) elif role == Qt.TextAlignmentRole: return Qt.AlignVCenter | Qt.AlignLeft
def setData(self, index: QModelIndex, value: str, role=None): value = None if not value else value self._table[index.row()][index.column()] = value self.dataChanged.emit(index, index) return True