Esempio n. 1
0
 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 = ''
Esempio n. 4
0
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
Esempio n. 5
0
 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()
Esempio n. 7
0
    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()
Esempio n. 9
0
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'))
Esempio n. 10
0
    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])
Esempio n. 11
0
# 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()