Still stumped with this, now cross-posted to https://gis.stackexchange.com/questions/474014/changing-attributes-of-a-newly-created-feature-in-python-form-init-code

I noticed that the both the `id(feature)` is always different when I look at it in either function which suggests the object got copied (by the `partial()` call?). The same is true for `feature.id()`. As a hack I tried using a global instead of passing the feature to `on_ok()`. [insert confused emoji here]

Probably I am blind to something really basic.

Cheers, Hannes

On 04.01.24 16:47, Johannes Kröger (WhereGroup) via QGIS-Developer wrote:

Hey guys,

I feel really dumb and I guess I am missing some basic concept...:

  * I have a layer with two attributes: "text" (string) and "int"
    (integer).
  * I used drag'n'drop form design to have a form with just the "text"
    attribute in it.
  * I added Python Init Code:

```
from functools import partial

def on_ok(layer, feature):
    field_idx = layer.fields().indexOf("int")
    attribute_changed = layer.changeAttributeValue(feature.id(), field_idx, 12345)
    if not attribute_changed:
        raise Exception("Attribute value could not be changed!")

def my_form_open(dialog, layer, feature):
    ok_button = dialog.findChild(QPushButton)
    ok_button.clicked.connect(partial(on_ok, layer, feature))
```

So the form does not show an input widget for the "int" field. But when pressing OK, the code should change the edited feature's "int" value to 12345.

This works if I edit existing features.

But if I create a new feature, the "int" value will be empty/NULL instead of 12345.

Any pointers on how to properly update a new feature's attribute fields, that exist on a layer but are not shown the user with the QGIS' widgets in the attribute form?

Cheers, Hannes
_______________________________________________
QGIS-Developer mailing list
QGIS-Developer@lists.osgeo.org
List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer
Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer

Reply via email to