5

With PyQGIS, I want to set project layer properties (Project Menu > Properties > DataSource) such as Identifiable, Searchable and Required (for Read Only, the method is QgsVectorLayer.setReadOnly() (link)).

In the API doc, for the method QgsProject.nonIdentifiableLayers(), it says:

Deprecated since version since: QGIS 3.4 use QgsMapLayer.setFlags() instead

But there is no clear documentation (for me) or example for how to use this new method QgsMapLayer.setFlags().

I would like to understand how to use this method.

2 Answers 2

8

I tried to understand the behavior of the setFlags method by see on a vector layer the results of :

vl = iface.activeLayer()
flags = 1
vl.setFlags(QgsMapLayer.LayerFlag(flags))
# result : the layer is identifiable and required

I looked at the Python API doc for QgsMapLayer, in these attributes and :

  • Identifiable = 1 (= 2 power 0)
  • Removable = 2 (= 2 power 1)
  • Searchable = 4 (= 2 power 2)

If we draw a binary table :

Num2 power 22 power 12 power 0
   0          0             0             0      
   1          0             0             1      
   2          0             1             0      
   3          0             1             1      
   4          1             0             0      
   5          1             0             1      
   6          1             1             0      
   7          1             1             1      

and a table of project layer settings (DataSource tab) with the result of vl.setFlags(QgsMapLayer.LayerFlag(Num)), 1 as True and 0 as False :

NumSearchable Required Identifiable
   0           0               1               0       
   1           0               1               1       
   2           0               0               0       
   3           0               0               1       
   4           1               1               0       
   5           1               1               1       
   6           1               0               0       
   7           1               0               1       

  • Identifiable behavior equals 2 power 0
  • Searchage behavior equals 2 power 2
  • but Removable behavior is the inverse of 2 power 1.

... and wait ! Required is the inverse of Removable.

For set these settings for a layer in a project, the code is :

vl = activeLayer()
identifiable = QgsMapLayer.Identifiable
searchable = QgsMapLayer.Searchable
removable = QgsMapLayer.Removable

# for a non-required and identifiable layer
vl.setFlags(QgsMapLayer.LayerFlag(identifiable + removable))

# for a searchable only layer
vl.setFlags(QgsMapLayer.LayerFlag(searchable + removable))

# for a searchable and required layer
vl.setFlags(QgsMapLayer.LayerFlag(searchable))

Or a function :

def layer_settings(vectorLayer, isIdentifiable=True,
    isSearchable=True, isRequired=False):

    flags = 0
    if isIdentifiable:
        flags += QgsMapLayer.Identifiable

    if isSearchable:
        flags += QgsMapLayer.Searchable

    if not isRequired:
        flags += QgsMapLayer.Removable

    vectorLayer.setFlags(QgsMapLayer.LayerFlag(flags))

vl = iface.activeLayer()
# for an identifiable and required layer
layer_settings(vl, True, False, True)
1

If it helps, to read the searchable and identifiable, we can use:

searchable = bool(QgsMapLayer.LayerFlag(layer.flags()) & 4)
identifiable = bool(QgsMapLayer.LayerFlag(layer.flags()) & 1)
print(searchable, identifiable)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.