def open_feature_form(self, ilayer, ifeature): """"open feature form based on clicked object on the canvas""" ilayer.startEditing() context = QgsAttributeEditorContext() context.setVectorLayerTools(self.iface.vectorLayerTools()) self.attributeForm = QgsAttributeForm(ilayer, ifeature, context) self.stackedWidget.addWidget(self.attributeForm) self.stackedWidget.setCurrentWidget(self.attributeForm) self.iface.setActiveLayer(ilayer) self.terug.clicked.connect(lambda: self.close_stacked(ilayer, ifeature))
def createFormWithDuplicateWidget(cls, vl, field_type, widget_type): """Creates a form with two identical widgets for the same field""" config = vl.editFormConfig() config.setLayout(QgsEditFormConfig.TabLayout) element = config.tabs()[0] element2 = element.clone(element) config.addTab(element2) vl.setEditFormConfig(config) vl.setEditorWidgetSetup(0, QgsEditorWidgetSetup(widget_type, {})) form = QgsAttributeForm(vl, next(vl.getFeatures())) assert (form.editable()) return form
def __init__(self, layer, iface): super().__init__(None) self.setWindowModality(Qt.WindowModal) layout = QVBoxLayout() layout.setMargin(0) layout.setContentsMargins(0, 0, 0, 0) self.setLayout(layout) dlgContext = QgsAttributeEditorContext() dlgContext.setFormMode(QgsAttributeEditorContext.StandaloneDialog) dlgContext.setAllowCustomUi(False) self.form = QgsAttributeForm(layer, context=dlgContext, parent=self) self.form.setMode(3) self.configureForm() layout.addWidget(self.form) self.form.zoomToFeatures.connect(self.zoomToFeatures) self.form.closed.connect(self.close) self.setWindowTitle(self.tr('Filter NavTable Features by Form')) self.expression = ''
class oivStackWidget(QDockWidget, FORM_CLASS): """open any feature form as stackwidget in OOIV pluging""" attributeForm = None parentWidget = None def __init__(self, parent=None): """Constructor.""" super(oivStackWidget, self).__init__(parent) self.iface = iface self.setupUi(self) def open_feature_form(self, ilayer, ifeature): """"open feature form based on clicked object on the canvas""" ilayer.startEditing() context = QgsAttributeEditorContext() context.setVectorLayerTools(self.iface.vectorLayerTools()) self.attributeForm = QgsAttributeForm(ilayer, ifeature, context) self.stackedWidget.addWidget(self.attributeForm) self.stackedWidget.setCurrentWidget(self.attributeForm) self.iface.setActiveLayer(ilayer) self.terug.clicked.connect(lambda: self.close_stacked(ilayer, ifeature)) def close_stacked(self, ilayer, ifeature): """close feature form and save changes""" self.attributeForm.save() self.terug.clicked.disconnect() ilayer.commitChanges() self.attributeForm.close() del self.attributeForm self.attributeForm = None if ilayer.name() == "Objecten": request = QgsFeatureRequest().setFilterExpression("id = " \ + str(ifeature["id"])) objectFeature = next(ilayer.getFeatures(request)) self.parentWidget.formelenaam.setText(objectFeature["formelenaam"]) self.close() try: self.parentWidget.show() self.iface.actionPan().trigger() except: # pylint: disable=bare-except pass del self
def setLayer(self, layer): if layer == self.layer: return if self.layer: try: self.layer.destroyed.disconnect(self.onLayerRemoved) except TypeError: # Do not care if it is not connected pass self.layer = layer if self.layer: self.layer.destroyed.connect(self.onLayerRemoved) self.layerComboBox.setLayer(layer) if self.attributeForm: try: self.attributeForm.deleteLater() except RuntimeError: # Sometimes the form has already been deleted, that's ok for us pass if self.layer is not None: context = QgsAttributeEditorContext() context.setVectorLayerTools(self.iface.vectorLayerTools()) context.setFormMode(QgsAttributeEditorContext.StandaloneDialog) self.attributeForm = QgsAttributeForm(self.layer, QgsFeature(), context) self.attributeForm.hideButtonBox() try: self.layer.updatedFields.disconnect( self.attributeForm.onUpdatedFields) except TypeError: pass fields = self.layer.fields() self.feature = QgsFeature(fields) for idx in range(self.layer.fields().count()): self.feature.setAttribute(idx, self.layer.defaultValue(idx)) self.feature.setValid(True) self.attributeForm.setFeature(self.feature) self.attributeForm.widgetValueChanged.connect( self.onAttributeChanged) self.formWidget.layout().addWidget(self.attributeForm) self.layerChanged.emit(self.layer)
def add_new_item(self): feature = QgsFeature() attribute_form = QgsAttributeForm(self.layer, parent=self) attribute_form.setMode(QgsAttributeEditorContext.AddFeatureMode) attribute_form.show()
def testBetweenFilter(self): """ Test creating a between type filter """ layer = QgsVectorLayer("Point?field=fldtext:string&field=fldint:integer", "test", "memory") form = QgsAttributeForm(layer) af = QgsAttributeFormEditorWidget(None, form) af.createSearchWidgetWrappers("DateTime", 0, {}) d1 = af.findChildren(QDateTimeEdit)[0] d2 = af.findChildren(QDateTimeEdit)[1] d1.setDateTime(QDateTime(QDate(2013, 5, 6), QTime())) d2.setDateTime(QDateTime(QDate(2013, 5, 16), QTime())) af.searchWidgetToolButton().setActiveFlags(QgsSearchWidgetWrapper.Between) self.assertEqual(af.currentFilterExpression(), '"fldtext">=\'2013-05-06\' AND "fldtext"<=\'2013-05-16\'') af.searchWidgetToolButton().setActiveFlags(QgsSearchWidgetWrapper.IsNotBetween) self.assertEqual(af.currentFilterExpression(), '"fldtext"<\'2013-05-06\' OR "fldtext">\'2013-05-16\'')
class NTSelectByFormDialog(QDialog): def __init__(self, layer, iface): super().__init__(None) self.setWindowModality(Qt.WindowModal) layout = QVBoxLayout() layout.setMargin(0) layout.setContentsMargins(0, 0, 0, 0) self.setLayout(layout) dlgContext = QgsAttributeEditorContext() dlgContext.setFormMode(QgsAttributeEditorContext.StandaloneDialog) dlgContext.setAllowCustomUi(False) self.form = QgsAttributeForm(layer, context=dlgContext, parent=self) self.form.setMode(3) self.configureForm() layout.addWidget(self.form) self.form.zoomToFeatures.connect(self.zoomToFeatures) self.form.closed.connect(self.close) self.setWindowTitle(self.tr('Filter NavTable Features by Form')) self.expression = '' def configureForm(self): ''' Hack to modify QgsAttributeForm ''' self.form.findChild(QWidget, 'searchButtonBox').hide() self.buttonBox = QDialogButtonBox() self.buttonBox.setOrientation(Qt.Horizontal) self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) self.buttonBox.setObjectName("buttonBox") self.buttonBox.accepted.connect(self.form.searchZoomTo) self.buttonBox.rejected.connect(self.reject) self.form.layout().addWidget(self.buttonBox) def zoomToFeatures(self, filter): self.expression = filter super().accept()
class AttributesDock(QgsDockWidget): layerChanged = pyqtSignal(QgsMapLayer) currentValueChanged = pyqtSignal(str, QVariant) def __init__(self, iface): QgsDockWidget.__init__( self, QCoreApplication.translate('AttributesDock', 'Quick Attribution')) self.iface = iface self.widget = QWidget() self.widget.setLayout(QGridLayout()) self.widget.setContentsMargins(0, 0, 0, 0) self.layerComboBox = QgsMapLayerComboBox() self.layerComboBox.layerChanged.connect(self.setLayer) self.layerComboBox.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.layerTitleLabel = QLabel() self.widget.layout().addWidget(self.layerTitleLabel, 0, 0, 1, 1) self.widget.layout().addWidget(self.layerComboBox, 0, 1, 1, 1) self.formWidget = QWidget() self.formWidget.setLayout(QGridLayout()) self.formWidget.setContentsMargins(0, 0, 0, 0) self.widget.layout().addWidget(self.formWidget, 1, 0, 1, 2) self.setWidget(self.widget) self.attributeForm = None self.layer = None self.feature = None self.layerComboBox.setFilters(QgsMapLayerProxyModel.WritableLayer | QgsMapLayerProxyModel.VectorLayer) QgsProject.instance().readProject.connect(self.onProjectRead) def setLayer(self, layer): if layer == self.layer: return if self.layer: try: self.layer.destroyed.disconnect(self.onLayerRemoved) except TypeError: # Do not care if it is not connected pass self.layer = layer if self.layer: self.layer.destroyed.connect(self.onLayerRemoved) self.layerComboBox.setLayer(layer) if self.attributeForm: try: self.attributeForm.deleteLater() except RuntimeError: # Sometimes the form has already been deleted, that's ok for us pass if self.layer is not None: context = QgsAttributeEditorContext() context.setVectorLayerTools(self.iface.vectorLayerTools()) context.setFormMode(QgsAttributeEditorContext.StandaloneDialog) self.attributeForm = QgsAttributeForm(self.layer, QgsFeature(), context) self.attributeForm.hideButtonBox() try: self.layer.updatedFields.disconnect( self.attributeForm.onUpdatedFields) except TypeError: pass fields = self.layer.fields() self.feature = QgsFeature(fields) for idx in range(self.layer.fields().count()): self.feature.setAttribute(idx, self.layer.defaultValue(idx)) self.feature.setValid(True) self.attributeForm.setFeature(self.feature) self.attributeForm.widgetValueChanged.connect( self.onAttributeChanged) self.formWidget.layout().addWidget(self.attributeForm) self.layerChanged.emit(self.layer) def onLayerRemoved(self): self.setLayer(None) def onAttributeChanged(self, attributeName, value, changed): idx = self.layer.fields().indexOf(attributeName) if value != 'NULL': defaultValue = QgsExpression.quotedValue(value) else: defaultValue = 'NULL' self.layer.blockSignals(True) self.layer.setDefaultValueDefinition(idx, QgsDefaultValue(defaultValue)) self.layer.blockSignals(False) self.currentValueChanged.emit(attributeName, value) def onProjectRead(self, doc): title, isDefined = QgsProject.instance().readEntry( 'quick_attribution', 'layercbxtitle') if isDefined: self.layerTitleLabel.setText(title) else: self.layerTitleLabel.setText(self.tr('Layer'))
def test_on_update(self): """Test live update""" layer = QgsVectorLayer("Point?field=age:int", "vl", "memory") # set default value for numbers to [1, {age}], it will depend on the field age and should update field = QgsField('numbers', QVariant.List, 'array') field.setEditorWidgetSetup(QgsEditorWidgetSetup('List', {})) layer.dataProvider().addAttributes([field]) layer.updateFields() layer.setDefaultValueDefinition(1, QgsDefaultValue('array(1, age)', True)) layer.setEditorWidgetSetup(1, QgsEditorWidgetSetup('List', {})) layer.startEditing() form = QgsAttributeForm(layer) feature = QgsFeature(layer.fields()) form.setFeature(feature) form.setMode(QgsAttributeEditorContext.AddFeatureMode) form.changeAttribute('numbers', [12]) form.changeAttribute('age', 1) self.assertEqual(form.currentFormFeature()['numbers'], [1, 1]) form.changeAttribute('age', 7) self.assertEqual(form.currentFormFeature()['numbers'], [1, 7])
# coding: utf-8 from qgis.gui import QgsAttributeForm from qgis.utils import iface layer = iface.activeLayer() attribute_form = QgsAttributeForm(layer, layer.getFeatures().next()) attribute_form.setMode(QgsAttributeForm.SingleEditMode) # SingleEditMode, AddFeatureMode, MultiEditMode, SearchMode attribute_form.show()