It kinda was...

I have custom widgets on another tab of the form for letting the user set up some things and I calculate values for attributes from that. So it is not solvable with default values. Very good idea though, I wish it would have been such an easy solution :))

When I posted also did not realise that it is not just about newly added features but different for:

a) A newly added feature
b) A feature was added but not yet committed to the data source
c) An existing feature

In the end I solved it by looking at the feature ID differently:

```
    feature_id = feature.id()
    if feature_id == -9223372036854775808:
        # this feature was newly added in this "form session"
        edit_buffer = layer.editBuffer()
        added_feats = edit_buffer.addedFeatures()
        # get the id of the most recently added feature in the edit buffer
        feature_id = min(list(added_feats.keys()))
    # otherwise we are looking at an existing feature, committed or not
    ... # layer.changeAttributeValue(feature_id, ...)
```

This works fine even if multiple forms are opened at the same time and OK is pressed on them in a random order.

I wonder if there is a named constant(?) or enum for that -9223372036854775808 (-2**63) somewhere. It is used by any new feature at that point in time. https://github.com/qgis/QGIS/blob/a3413a9a9365fbd52ba6b0e2a6b9e55acc634cd4/tests/src/python/test_qgsvectorlayereditbuffer.py#L470 says "ID is NULL (-9223372036854775808)" but I bet there is a better way in PyQt of saying "minimal INT64 value" instead of pasting the full value into the code like I did?

Many thanks to Stefanos and Frank for their thoughts!
I had cross-posted to https://gis.stackexchange.com/questions/474014/changing-attributes-of-a-newly-created-feature-in-python-form-init-code and the user Matt gave me pointers into the right direction.

Feels super ugly and probably not the intended way to do this kind of thing but WORKSFORME, done ;)

Cheers, Hannes

On 10.01.24 21:06, Stefanos Natsis via QGIS-Developer wrote:
Hi Hannes

This looks like an XY problem case!

If your actual goal is to:
> 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?

then you simply need to set a Default Value for the field widget but not add it to the drag and drop form designer. :)

If you really want to do this using form init code, you cannot do it using the form's feature object as it is actually copied by QgsAttributeForm before being saved to the layer. You could connect to QgsAttributeForm::featureSaved() signal instead, that emits the actual feature, but apparently the my_form_open function is called twice: once when the form is loaded and once after OK is clicked (bug??), so that would create the connection twice! To avoid this you could connect to QgsAttributeForm::featureSaved() only after OK is clicked!

Best
Stefanos

_______________________________________________
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