def loadListForFindingType(self, findingType): model = QSqlRelationalTableModel(self, self.dbm.db) model.setTable(u"befundart") model.removeColumn(0) model.setFilter( u"befundart = '{0}' AND befundart_detail IS NOT NULL".format( findingType)) model.select() if model.rowCount() < 1: QMessageBox.warning( self, "Result", u"Für die Befundart '{0}' wurden keine Detail Einträge gefunden." .format(findingType)) return False self.uiFindingTypeDetailTableV.setModel(model) self.uiFindingTypeDetailTableV.setSelectionBehavior( QAbstractItemView.SelectRows) self.uiFindingTypeDetailTableV.verticalHeader().setVisible(False) self.uiFindingTypeDetailTableV.hideColumn(0) if findingType != "Siedlung": self.uiFindingTypeDetailTableV.hideColumn(2) #self.uiRemarksTableV.model().insertColumn(0) self.uiFindingTypeDetailTableV.resizeRowsToContents() self.uiFindingTypeDetailTableV.resizeColumnsToContents() self.uiFindingTypeDetailTableV.horizontalHeader( ).setStretchLastSection(True) self.uiFindingTypeDetailTableV.selectionModel( ).selectionChanged.connect(self.generateFindingTypeDetail) return True
def setupComboBox(self, editor, table, modelColumn, depend): model = QSqlRelationalTableModel(self, self.dbm.db) model.setTable(table) model.removeColumn(0) model.select() tv = QTableView() editor.setView(tv) tv.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) tv.setSelectionMode(QAbstractItemView.SingleSelection) tv.setSelectionBehavior(QAbstractItemView.SelectRows) tv.setAutoScroll(False) editor.setModel(model) editor.setModelColumn(modelColumn) editor.setInsertPolicy(QComboBox.NoInsert) tv.resizeColumnsToContents() tv.resizeRowsToContents() tv.verticalHeader().setVisible(False) tv.horizontalHeader().setVisible(True) #tv.setMinimumWidth(tv.horizontalHeader().length()) tv.horizontalHeader().setStretchLastSection(True) #tv.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents) tv.resizeColumnsToContents() scroll = 0 if editor.count() <= editor.maxVisibleItems() else QApplication.style().pixelMetric(QStyle.PM_ScrollBarExtent) tv.setMinimumWidth(tv.horizontalHeader().length() + scroll) #self.fixComboBoxDropDownListSizeAdjustemnt(editor) #editor.resize(tv.horizontalHeader().sizeHint()) completer = QCompleter(editor.model()) editor.setCompleter(completer) #editor.setAutoCompletion(True) editor.lineEdit().setValidator(InListValidator([editor.itemText(i) for i in range(editor.count())], editor.lineEdit(), depend, self)) if depend: editor.currentIndexChanged.connect(partial(self.updateDepends, editor, depend))
class TableModel(): def __init__(self, db): self.model = QSqlRelationalTableModel(db=db) self.model.setTable('balance') self.model.setEditStrategy(QSqlRelationalTableModel.OnFieldChange) self.model.setRelation(1, QSqlRelation('items', 'id', 'name')) self.model.setRelation(2, QSqlRelation('categories', 'id', 'name')) self.model.setRelation(4, QSqlRelation('currencies', 'id', 'name')) self.model.setRelation(5, QSqlRelation('users', 'id', 'full_name')) self.model.setRelation(6, QSqlRelation('places', 'id', 'name')) self.model.setRelation(8, QSqlRelation('measures', 'id', 'short')) self.model.setHeaderData(0, Qt.Horizontal, QtGui.qApp.tr("ID")) self.model.setHeaderData(1, Qt.Horizontal, QtGui.qApp.tr("Item")) self.model.setHeaderData(2, Qt.Horizontal, QtGui.qApp.tr("Category")) self.model.setHeaderData(3, Qt.Horizontal, QtGui.qApp.tr("Cost")) self.model.setHeaderData(4, Qt.Horizontal, QtGui.qApp.tr("Currency")) self.model.setHeaderData(5, Qt.Horizontal, QtGui.qApp.tr("By whom")) self.model.setHeaderData(6, Qt.Horizontal, QtGui.qApp.tr("Where")) self.model.setHeaderData(7, Qt.Horizontal, QtGui.qApp.tr("Qty/Amount")) self.model.setHeaderData(8, Qt.Horizontal, QtGui.qApp.tr("Units")) self.model.setHeaderData(9, Qt.Horizontal, QtGui.qApp.tr("is spending")) self.model.setHeaderData(10, Qt.Horizontal, QtGui.qApp.tr("Note")) self.model.setHeaderData(11, Qt.Horizontal, QtGui.qApp.tr("Date and " "Time")) self.model.removeColumn(12) self.model.removeColumn(13) if not self.model.select(): _log("Table model selection error[%s]: %s" % ( self.model.lastError().type(), self.model.lastError().text() )) def get_model(self): return self.model
class APISAdvancedInputDialog(QDialog): def __init__(self, dbm, tableName, showEntriesCombo, modelColumnName=None, excludeEntries=None, parent=None): super(APISAdvancedInputDialog, self).__init__(parent) self.dbm = dbm self.tableName = tableName self.modelColumnName = modelColumnName self.showEntriesCombo = showEntriesCombo self.excludeEntries = excludeEntries self.valueToBeAdded = None self.editors = None self.record = None self.tableExists = False if self.prepairEditorsAndRecord(): self.setupForm() else: pass # something went wrong preping def prepairEditorsAndRecord(self): if not DbHasTable(self.dbm.db, self.tableName): return False self.tableExists = True self.model = QSqlRelationalTableModel(self, self.dbm.db) self.model.setTable(self.tableName) self.model.select() while (self.model.canFetchMore()): self.model.fetchMore() self.record = self.model.record() self.editors = [] for fIdx in range(self.record.count()): field = self.record.field(fIdx) if field.name() != "ogc_fid": self.editors.append({ 'name': field.name(), 'type': field.type(), 'lineEdit': QLineEdit() }) return True def setupForm(self): layout = QFormLayout() if self.showEntriesCombo: self.uiAvailableEntriesCombo = QComboBox() # populate (but exlude if exclude has elements) if self.excludeEntries and len(self.excludeEntries) > 0: self.model.setFilter("{0} NOT IN ({1})".format( self.modelColumnName, ",".join("'{0}'".format(i) for i in self.excludeEntries))) # QMessageBox.information(self, "info", "{0} NOT IN ({1})".format(self.modelColumnName, ",".join("'{0}'".format(i) for i in self.excludeEntries))) # self.model.select() self.model.removeColumn(0) self.setupComboBox(self.uiAvailableEntriesCombo, self.model.fieldIndex(self.modelColumnName)) layout.addRow(self.uiAvailableEntriesCombo) self.uiAddBtn = QPushButton("Hinzufügen") if self.uiAvailableEntriesCombo.count() < 1: self.uiAddBtn.setEnabled(False) self.uiAddBtn.clicked.connect(self.addInputToSelection) layout.addRow(self.uiAddBtn) for editor in self.editors: # QMessageBox.information(self, "info", "{}".format((editor["name"]))) if editor["name"] != "ogc_fid": label = QLabel(editor["name"]) # QMessageBox.information(None, "info", "{}".format(editor["type"])) if editor["type"] == QVariant.Int: intVal = QIntValidator() intVal.setBottom(0) editor['lineEdit'].setValidator(intVal) layout.addRow(label, editor['lineEdit']) editor['lineEdit'].textEdited.connect(self.onTextEdited) self.uiSubmitBtn = QPushButton("Speichern") self.uiSubmitBtn.setEnabled(False) self.uiSubmitBtn.clicked.connect(self.saveInputAsQSqlRecord) layout.addRow(self.uiSubmitBtn) self.setLayout(layout) self.setWindowTitle("APIS Input Dialog") self.adjustSize() def onTextEdited(self, text): for editor in self.editors: if len(editor['lineEdit'].text().replace(" ", "")) == 0: self.uiSubmitBtn.setEnabled(False) return self.uiSubmitBtn.setEnabled(True) def addInputToSelection(self): self.setValueToBeAdded(self.uiAvailableEntriesCombo.currentText()) self.accept() def setValueToBeAdded(self, value): self.valueToBeAdded = value def getValueToBeAdded(self): return self.valueToBeAdded def saveInputAsQSqlRecord(self): for editor in self.editors: self.record.setValue(editor["name"], editor['lineEdit'].text()) if not self.record.isEmpty(): result = self.model.insertRowIntoTable(self.record) if result: self.setValueToBeAdded( self.record.field(self.modelColumnName).value()) self.accept() else: QMessageBox.warning( self, "DB Fehler", "Der folgende Feheler ist aufgetreten: {}".format( self.model.lastError().text())) self.reject() else: self.reject() def setupComboBox(self, editor, modelColumn): tv = QTableView() editor.setView(tv) tv.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) tv.setSelectionMode(QAbstractItemView.SingleSelection) tv.setSelectionBehavior(QAbstractItemView.SelectRows) tv.setAutoScroll(False) editor.setModel(self.model) editor.setModelColumn(modelColumn) editor.setInsertPolicy(QComboBox.NoInsert) tv.resizeColumnsToContents() tv.resizeRowsToContents() tv.verticalHeader().setVisible(False) tv.horizontalHeader().setVisible(True) #tv.setMinimumWidth(tv.horizontalHeader().length()) tv.horizontalHeader().setStretchLastSection(True) #tv.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents) tv.resizeColumnsToContents() scroll = 0 if editor.count() <= editor.maxVisibleItems( ) else QApplication.style().pixelMetric(QStyle.PM_ScrollBarExtent) tv.setMinimumWidth(tv.horizontalHeader().length() + scroll)