class CurrencyComboBox(QComboBox): changed = Signal(int) def __init__(self, parent): QComboBox.__init__(self, parent) self.p_selected_id = 0 self.model = None self.activated.connect(self.OnUserSelection) self.query = QSqlQuery(db=db_connection()) self.query.prepare(f"SELECT id, symbol FROM currencies") self.query.exec() self.model = QSqlTableModel(db=db_connection()) self.model.setQuery(self.query) self.model.select() self.setModel(self.model) self.setModelColumn(self.model.fieldIndex("symbol")) def isCustom(self): return True def getId(self): return self.p_selected_id def setId(self, new_id): if self.p_selected_id == new_id: return self.p_selected_id = new_id name = readSQL("SELECT symbol FROM currencies WHERE id=:id", [(":id", self.p_selected_id)]) if self.currentIndex() == self.findText(name): return self.setCurrentIndex(self.findText(name)) selected_id = Property(int, getId, setId, notify=changed, user=True) def setIndex(self, index): if index is not None: self.selected_id = index self.changed.emit(self.selected_id) @Slot() def OnUserSelection(self, _selected_index): self.selected_id = self.model.record(self.currentIndex()).value("id") self.changed.emit(self.selected_id)
class DbLookupComboBox(QComboBox): def __init__(self, parent=None): QComboBox.__init__(self, parent) self._model = None self._table = '' self._key_field = '' self._field = '' self._selected_id = -1 def getKey(self): return readSQL( f"SELECT {self._key_field} FROM {self._table} WHERE {self._field}='{self.currentText()}'" ) def setKey(self, selected_id): if self._selected_id == selected_id: return self._selected_id = selected_id value = readSQL( f"SELECT {self._field} FROM {self._table} WHERE {self._key_field}={selected_id}" ) self.setCurrentIndex(self.findText(value)) key = Property(int, getKey, setKey, user=True) def setupDb(self, table, key_field, field): self._table = table self._field = field self._key_field = key_field self._model = QSqlTableModel(parent=self, db=db_connection()) self._model.setTable(table) field_idx = self._model.fieldIndex(field) self._model.setSort(field_idx, Qt.AscendingOrder) self._model.select() self.setModel(self._model) self.setModelColumn(field_idx)