def createEditor(self, parent, option, index): editor = QgsFieldExpressionWidget(parent) editor.setLayer(index.model().layer()) editor.registerExpressionContextGenerator(index.model().contextGenerator()) editor.fieldChanged.connect(self.on_expression_fieldChange) editor.setAutoFillBackground(True) return editor
def addLayerFields(self, layer_source): layer = layer_source.layer if layer.type() != QgsMapLayer.VectorLayer: return for i, field in enumerate(layer.fields()): row = self.rowCount() ews = layer.editorWidgetSetup(i) if ews.type() == 'ExternalResource': # for later: if ews.config().get('DocumentViewer', QgsExternalResourceWidget.NoContent) == QgsExternalResourceWidget.Image: self.insertRow(row) item = QTableWidgetItem(layer.name()) item.setData(Qt.UserRole, layer_source) self.setItem(row, 0, item) item = QTableWidgetItem(field.name()) self.setItem(row, 1, item) ew = QgsFieldExpressionWidget() ew.setLayer(layer) expression = layer_source.photo_naming(field.name()) ew.setExpression(expression) self.setCellWidget(row, 2, ew) self.resizeColumnsToContents()
def createEditor(self, parent, option, index): editor = QgsFieldExpressionWidget(parent) editor.setLayer(index.model().layer()) editor.registerExpressionContextGenerator(index.model().contextGenerator()) editor.fieldChanged.connect(self.on_expression_fieldChange) editor.setAutoFillBackground(True) editor.setAllowEvalErrors(self.parent().dialogType == DIALOG_MODELER) return editor
def action_field_add(self): #self.bar.pushMessage("Trigger", "signal received", level=QgsMessageBar.INFO) field_expression_widget = QgsFieldExpressionWidget() field_expression_widget.setLayer(self.lyrCombobox.currentLayer()) color_btn_widget = QgsColorButton() spinbox = QtGui.QSpinBox() presetrow = PresetRow(qgsfieldexpressionwidget=field_expression_widget, qgscolorbutton=color_btn_widget, qspinbox=spinbox) self._preset_rows.add_preset(presetrow) self.redraw_fields()
def copy(self): field_expression_widget = QgsFieldExpressionWidget() field_expression_widget.setLayer( self._qgsfieldexpressionwidget.layer()) field_expression_widget.setField( self._qgsfieldexpressionwidget.currentText()) color_btn_widget = QgsColorButton() color_btn_widget.setColor(self._qgscolorbutton.color()) spinbox = QtGui.QSpinBox() spinbox.setValue(self._qspinbox.value()) return PresetRow(field_expression_widget, color_btn_widget, spinbox)
def __addRow(self): """ Add a row for the fields """ count = self.mTableWidget.rowCount() self.mTableWidget.insertRow(count) comboBox = QtWidgets.QComboBox() layer = self.mLayerOutput.currentLayer() comboBox.insertItems(0, [f.displayName() for f in layer.fields()]) self.mTableWidget.setCellWidget(count, 0, comboBox) expr = QgsFieldExpressionWidget() expr.setLayer(layer) self.mTableWidget.setCellWidget(count, 1, expr)
def createEditor(self, parent, option, index): column = index.column() fieldType = FieldsMappingModel.columns[column]['type'] if fieldType == QtCore.QVariant.Type: editor = QtGui.QComboBox(parent) for key, text in FieldsMappingModel.fieldTypes.iteritems(): editor.addItem(text, key) elif fieldType == QgsExpression: editor = QgsFieldExpressionWidget(parent) editor.setLayer(index.model().layer()) # editor.fieldChanged.connect(self.on_expression_fieldChange) else: editor = QtGui.QStyledItemDelegate.createEditor(self, parent, option, index) editor.setAutoFillBackground(True) return editor
def addExpressionWidget(self): hor = QHBoxLayout() fieldExp = QgsFieldExpressionWidget() combo = QComboBox() hor.addWidget(combo) self.combos.append(combo) hor.addWidget(fieldExp) del_btn = QPushButton(self.tr("Delete")) hor.addWidget(del_btn) self.dels.append(del_btn) self.verticalLayout.addLayout(hor) self.exps.append(fieldExp) self.hors.append(hor) if self.slave is not None: self.updateComboBoxFromLayerAttributes(combo, self.slave.fields()) if self.master is not None: fieldExp.setLayer(self.master) del_btn.clicked.connect(self.removeExpressionWidget)
def addExpressionWidget(self): hor = QtGui.QHBoxLayout() fieldExp = QgsFieldExpressionWidget() combo = QtGui.QComboBox() hor.addWidget(combo) self.combos.append(combo) hor.addWidget(fieldExp) del_btn = QtGui.QPushButton(self.tr("Delete")) hor.addWidget(del_btn) self.dels.append(del_btn) self.verticalLayout.addLayout(hor) self.exps.append(fieldExp) self.hors.append(hor) if self.slave is not None: self.updateComboBoxFromLayerAttributes(combo, self.slave.fields()) if self.master is not None: fieldExp.setLayer(self.master) del_btn.clicked.connect(self.removeExpressionWidget)
def createEditor(self, parent, option, index): column = index.column() fieldType = FieldsMappingModel.columns[column]['type'] if fieldType == QtCore.QVariant.Type: editor = QtGui.QComboBox(parent) for key, text in FieldsMappingModel.fieldTypes.iteritems(): editor.addItem(text, key) elif fieldType == QgsExpression: editor = QgsFieldExpressionWidget(parent) editor.setLayer(index.model().layer()) editor.fieldChanged.connect(self.on_expression_fieldChange) else: editor = QtGui.QStyledItemDelegate.createEditor( self, parent, option, index) editor.setAutoFillBackground(True) return editor
class vectorLayerPropertyDlg(QDialog): ''' classdocs ''' def __init__(self, parent, layer): ''' Constructor ''' QDialog.__init__(self, parent) self.ui = Ui_VectorLayerProPertyDialog() self.ui.setupUi(self) self.ui.txtLayerName.setText(layer.name()) self.ui.txtLayerSource.setText(layer.source()) self.ui.txtCrs.setText(layer.crs().authid() + " - " + layer.crs().description()) self.ui.btnCrsSelect.clicked.connect(self.selectCrs) self.mCrs = layer.crs() self.vLayer = layer self.ui.mOptionsListWidget.currentRowChanged.connect( self.changeStackWidget) ''' init RenderV2 Widget''' self.mRendererDialog = QgsRendererV2PropertiesDialog( self.vLayer, QgsStyleV2.defaultStyle(), True) self.ui.stackedWidget.insertWidget(1, self.mRendererDialog) self.ui.buttonBox.accepted.connect(self.OK) frame_Label = QFrame() verticalLayout_Label = QVBoxLayout(frame_Label) self.mLabelWidget = QgsFieldExpressionWidget() self.mLabelWidget.setLayer(layer) verticalLayout_Label.addWidget(self.mLabelWidget) spacerItem = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) verticalLayout_Label.addItem(spacerItem) frame_Label.setLayout(verticalLayout_Label) self.ui.stackedWidget.insertWidget(2, frame_Label) # self.ui.buttonBox.accepted.connect(self.OK) def selectCrs(self): projectionDlg = QgsGenericProjectionSelector(self) projectionDlg.setSelectedAuthId(self.mCrs.authid()) if projectionDlg.exec_(): self.mCrs = QgsCoordinateReferenceSystem( projectionDlg.selectedCrsId(), QgsCoordinateReferenceSystem.InternalCrsId) self.ui.txtCrs.setText(self.mCrs.authid() + " - " + self.mCrs.description()) def changeStackWidget(self, index): self.ui.stackedWidget.setCurrentIndex(index) def OK(self): self.vLayer.setCrs(self.mCrs) self.mRendererDialog.apply() self.vLayer.triggerRepaint() if self.ui.stackedWidget.currentIndex( ) == 2 and self.mLabelWidget.currentText() != "": self.vLayer.setCustomProperty("labeling", "pal") self.vLayer.setCustomProperty("labeling/enabled", "true") self.vLayer.setCustomProperty("labeling/fontFamily", "Arial") self.vLayer.setCustomProperty("labeling/fontSize", "8") self.vLayer.setCustomProperty("labeling/fieldName", self.mLabelWidget.currentText()) # palLayerSetting = QgsPalLayerSettings() # palLayerSetting.readFromLayer(self.vLayer) # palLayerSetting.enabled = True # palLayerSetting.fieldName = self.mLabelWidget.currentText() # palLayerSetting.isExpression = True if self.vLayer.geometryType() == QGis.Line: self.vLayer.setCustomProperty("labeling/placement", "2") self.vLayer.setCustomProperty( "labeling/placementFlags", str(QgsPalLayerSettings.AboveLine)) # palLayerSetting.placement = QgsPalLayerSettings.Line # palLayerSetting.placementFlags = QgsPalLayerSettings.AboveLine elif self.vLayer.geometryType() == QGis.Point: self.vLayer.setCustomProperty("labeling/placement", "0") self.vLayer.setCustomProperty( "labeling/placementFlags", str(QgsPalLayerSettings.AroundPoint)) # self.vLayer.setCustomProperty("labeling/placementFlags", "0") # palLayerSetting.placement = QgsPalLayerSettings.Points # palLayerSetting.placementFlags = QgsPalLayerSettings.AroundPoint else: self.vLayer.setCustomProperty("labeling/placement", "3") self.vLayer.setCustomProperty( "labeling/placementFlags", str(QgsPalLayerSettings.AboveLine)) # palLayerSetting.placement = QgsPalLayerSettings.PolygonBoundary # palLayerSetting.placementFlags = QgsPalLayerSettings.AboveLine # palLayerSetting.setDataDefinedProperty(QgsPalLayerSettings.Size, True, True, '8', "") # palLayerSetting.writeToLayer(self.vLayer) elif self.ui.stackedWidget.currentIndex( ) == 2 and self.mLabelWidget.currentText() == "": self.vLayer.setCustomProperty("labeling", "") QgsProject.instance().dirty(True) QDialog.accept(self)
class PresetRow(): def __init__(self, qgsfieldexpressionwidget=None, qgscolorbutton=None, qspinbox=None): self._qgsfieldexpressionwidget = qgsfieldexpressionwidget if qgsfieldexpressionwidget is None: self._qgsfieldexpressionwidget = QgsFieldExpressionWidget() self._qgscolorbutton = qgscolorbutton if qgscolorbutton is None: self._qgscolorbutton = QgsColorButton() self._qspinbox = qspinbox if qspinbox is None: self._qspinbox = QtGui.QSpinBox() self._last_feature = None def set_layer(self, layer_id): self._qgsfieldexpressionwidget.setLayer(layer_id) def __del__(self): self._qgsfieldexpressionwidget.deleteLater() self._qgsfieldexpressionwidget = None self._qgscolorbutton.deleteLater() self._qgscolorbutton = None self._qspinbox.deleteLater() self._qspinbox = None def __str__(self): return "{}-{}-{}".format(str(self._qgsfieldexpressionwidget), str(self._qgscolorbutton), str(self._qspinbox)) def __repr__(self): return self.__str__() def asLst(self): return self._qgscolorbutton, self._qgsfieldexpressionwidget, self._qspinbox @property def qgsfieldexp(self): return self._qgsfieldexpressionwidget @property def exp_txt(self): return self._qgsfieldexpressionwidget.currentText() @property def qgscolorbutton(self): return self._qgscolorbutton @property def qspinbox(self): return self._qspinbox @property def lvl(self): return self._qspinbox.value() def copy(self): field_expression_widget = QgsFieldExpressionWidget() field_expression_widget.setLayer( self._qgsfieldexpressionwidget.layer()) field_expression_widget.setField( self._qgsfieldexpressionwidget.currentText()) color_btn_widget = QgsColorButton() color_btn_widget.setColor(self._qgscolorbutton.color()) spinbox = QtGui.QSpinBox() spinbox.setValue(self._qspinbox.value()) return PresetRow(field_expression_widget, color_btn_widget, spinbox) #=========================================================================== # #=========================================================================== def dump(self): exp = self._qgsfieldexpressionwidget.currentText() #color=self._qgscolorbutton.color().name() color = self._qgscolorbutton.color().rgba() idx = self._qspinbox.value() res = {"exp": exp, "color": color, "idx": idx} return json.dumps(res) #======================================================================= # #======================================================================= def load(self, str_dump): res = json.loads(str_dump) self._qgsfieldexpressionwidget.setField(res["exp"]) #self._qgscolorbutton.color().setNamedColor(res["color"]) qcolor = self._qgscolorbutton.color() qcolor.setRgba(res["color"]) self._qgscolorbutton.setColor(qcolor) self._qspinbox.setValue(res["idx"]) @property def exp(self): return QgsExpression(self._qgsfieldexpressionwidget.asExpression()) @property def qcolor(self): return self._qgscolorbutton.color() @property def color_rgba(self): return self._qgscolorbutton.color().rgba() @property def color_hex(self): return self._qgscolorbutton.color().name() def setFeature(self, feature): self._last_feature = feature def execute(self, feature=None): if feature is not None: self.setFeature(feature) if self._last_feature is None: return None else: return self.exp.evaluate(self._last_feature)