[Qgis-user] Python form logic on attribute table open

Matthias Kuhn matthias at opengis.ch
Tue May 3 23:10:15 PDT 2016


Hi Tom,

Hmm... Maybe there is such a method do determine the context (can't
recall right now). But in your case I would simply use something like:

geom = ...
parishField = ...
if not geom:
    parishField.setPlaceholderText('No geometry found')
    return

On 05/03/2016 04:49 PM, Thomas Colley wrote:
>
> Hi Matthias
>
>  
>
> Thanks for the explanation, I think I am using globals where I
> shouldn’t be. In this case I don’t think it’s the global variable
> causing the problem though.
>
>  
>
> I’ve stripped everything back to a really simple example (no global
> variables). I have a custom UI with one QLineEdit called parish.
>
>  
>
> On opening the form Python performs an intersect with the feature
> against a polygon layer of parishes and uses the parish name to set
> the text in the QLineEdit.
>
>  
>
> from PyQt4.QtCore import *
>
> from PyQt4.QtGui import *
>
> from qgis.core import *
>
> from qgis.gui import *
>
>  
>
> def my_form_open(dialog, layer, feature):
>
>                 geom = feature.geometry()
>
>                 parishField = dialog.findChild(QLineEdit, "parish")
>
>                 for lyr in
> QgsMapLayerRegistry.instance().mapLayers().values():
>
>                                 if lyr.name() == 'parishes':
>
>                                                 for f in
> lyr.getFeatures():
>
>                                                                 if
> geom.intersects(f.geometry()):
>
>                                                                                
> parishField.setText(f.attribute('name'))
>
>                                                                                
> break
>
>                                                 break
>
>  
>
> This works fine using the identify tool but throws up the following
> error when opening the attribute table:
>
>  
>
> An error occurred during execution of following code:
> my_form_open( _qgis_featureform_22_16,
> _qgis_layer_test_lines20160503150512486_16,
> _qgis_feature_20160503154237941)
>
>
> Traceback (most recent call last):
>   File "", line 1, in
>   File "", line 23, in my_form_open
> AttributeError: 'NoneType' object has no attribute 'intersects'
>
>  
>
> I can see why the error is happening: When opening the attribute table
> the feature is passed without geometry so the intersect fails, but for
> my purposes I don’t want it to be running the Python code anyway as I
> don’t want it calculating fields unless I’ve actually clicked on the
> feature. Opening the attribute table just runs it against the first
> record in the table.
>
>  
>
> That’s why I was hoping there’d be some way of detecting the context
> of the form. QgsAttributeEditorContext has a FormMode that returns
> Embed, StandaloneDialog or Popup, so I thought that looked promising
> but I can’t work out how to access it.
>
>  
>
> Thanks
>
>  
>
> Tom
>
>  
>
> *From:*Matthias Kuhn [mailto:matthias at opengis.ch]
> *Sent:* 03 May 2016 13:52
> *To:* Thomas Colley; qgis-user at lists.osgeo.org
> *Subject:* Re: [Qgis-user] Python form logic on attribute table open
>
>  
>
> Hi Tom,
>
> Globals are really for "there will only ever be one of these" objects.
> And that's not true for feature forms.
> You will have the same kind of trouble if the user opens the feature
> form of two features in parallel because they will work on the same
> global variable (which will be overwritten and may even be deleted by
> form A whil form B is still open).
>
> I assume you have a slot connected to some widget's changed signal and
> need the reference to parameters inside the slot. It's best to pass
> them as parameters to the slot.
>
> Something like:
>
> ----------
>
> import functools
>
> def my_slot( my_form, new_text ):
>     do_something_with(my_control)
>     print new_text
>
> def form_init(form, y, z):
>     control.textChanged.connect(functools.partial(my_slot, form))
>
> ----------
>
> On 05/03/2016 01:50 PM, Thomas Colley wrote:
>
>     Hi Matthias
>
>      
>
>     I am using global variables. In what way do they cause problems?
>
>      
>
>     Is it expected behaviour for the Python logic to be used when the
>     attribute table is opened?
>
>      
>
>     I know what is causing the Python error. I am performing an
>     intersect query to populate an attribute. When I open the
>     attribute table the first feature in the attribute table is being
>     passed to the Python form object but it doesn’t include the
>     geometry. This gives AttributeError: 'NoneType' object has no
>     attribute 'intersects'.
>
>      
>
>     I have no need for any of the Python logic on opening of the
>     attribute table, although I can see the advantage if it was open
>     in form view.
>
>      
>
>     Hope this makes sense, if you have any more details on the global
>     variables I’d be grateful.
>
>      
>
>     Thanks
>
>
>     Tom
>
>      
>
>     *From:*Qgis-user [mailto:qgis-user-bounces at lists.osgeo.org] *On
>     Behalf Of *Matthias Kuhn
>     *Sent:* 03 May 2016 09:45
>     *To:* qgis-user at lists.osgeo.org <mailto:qgis-user at lists.osgeo.org>
>     *Subject:* Re: [Qgis-user] Python form logic on attribute table open
>
>      
>
>     Hi Tom,
>
>     Are you using global variables? They often lead to troubles in
>     this context.
>
>     Matthias
>
>     On 05/03/2016 10:42 AM, Thomas Colley wrote:
>
>         Hi
>
>          
>
>         I have a Python init function bound to an attribute form. This
>         is working great using the identify tool to open a feature
>         form but is throwing an error when I open the layer’s
>         attribute table.
>
>          
>
>         Is there any way I can check in the Python whether a feature
>         form has been opened or the attribute table. I have no need
>         for the logic when opening the attribute table.
>
>          
>
>         I’ve found QgsAttributeEditorContext that looks like it might
>         do the trick but I can’t work out how to access it.
>
>          
>
>         Any advice would be appreciated.
>
>          
>
>         Thanks
>
>
>         Tom
>
>
>
>
>
>         _______________________________________________
>
>         Qgis-user mailing list
>
>         Qgis-user at lists.osgeo.org <mailto:Qgis-user at lists.osgeo.org>
>
>         List info: http://lists.osgeo.org/mailman/listinfo/qgis-user
>
>         Unsubscribe: http://lists.osgeo.org/mailman/listinfo/qgis-user
>
>
>
>
>     -- 
>
>     Matthias Kuhn
>
>     OPENGIS.ch - https://www.opengis.ch
>
>     Spatial • (Q)GIS • PostGIS • Open Source
>
>
>
> -- 
> Matthias Kuhn
> OPENGIS.ch - https://www.opengis.ch
> Spatial • (Q)GIS • PostGIS • Open Source

-- 
Matthias Kuhn
OPENGIS.ch - https://www.opengis.ch
Spatial • (Q)GIS • PostGIS • Open Source

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-user/attachments/20160504/e211ac02/attachment.html>


More information about the Qgis-user mailing list