0

I've been writing a standalone Python script that calls QGIS 3 libraries to draw stuff in a QWidget. I'm trying to change the visibility of layers based on a callback, but it doesn't seem to work.

Here is an MRE of the problem:

#!/usr/bin/env python3
import argparse
import os.path

from qgis.core import ( QgsApplication, QgsProject, QgsVectorLayer, QgsWkbTypes, ) QgsApplication.setPrefixPath("/usr/bin", True) from qgis.gui import ( QgsMapCanvas, )

def main(): qgs = QgsApplication([],True) qgs.initQgis()

filepath = '/PATH_TO_S57_FILE/S57.000'
layer = getALayerWithGeometry(filepath)
print(layer.name())

canvas = QgsMapCanvas()
canvas.show()

QgsProject.instance().addMapLayer(layer)
canvas.setLayers([layer])
canvas.setExtent(layer.extent())

layer_tree = QgsProject.instance().layerTreeRoot().findLayer(layer)
breakpoint()
# vis_target = not layer_tree.isVisible()
# layer_tree.setItemVisibilityChecked(vis_target)

def getALayerWithGeometry(filepath): dataLayer = QgsVectorLayer(filepath,'S57 data','ogr')

subLayer_str = dataLayer.dataProvider().subLayers()
for (iSubLayer,subLayer_str) in enumerate(subLayer_str):
    subLayerDefs = subLayer_str.replace('!','').split('::')

    id_ = subLayerDefs[0]
    objectAcr = subLayerDefs[1]
    geometryType = subLayerDefs[3]

    composedURI = f'{filepath}|layerid={id_}|geometrytype={geometryType}'
    layer = QgsVectorLayer(composedURI,f'{objectAcr}({geometryType})','ogr')
    if layer.geometryType() not in (QgsWkbTypes.UnknownGeometry,QgsWkbTypes.NullGeometry):
        return layer

if name == "main": main()

Then at the breakpoint:

vis_target = not layer_tree.isVisible()
layer_tree.setItemVisibilityChecked(vis_target)
  • This attempts to use setItemVisibilityChecked() after a QgsProject.instance().layerTreeRoot().findLayer() call described here and here.
  • Setting layers with canvas.setLayers() works, but I would like to avoid that if possible.
PolyGeo
  • 65,136
  • 29
  • 109
  • 338
Cadmus
  • 1
  • You need to set a bridge between the canvas and the layer tree. Read the "Interaction with Canvas" section of https://www.lutraconsulting.co.uk/blog/2015/01/30/qgis-layer-tree-api-part-3/, which gives you the code to do so. After setting such a connection, you should be able to see the interaction between both components. – Germán Carrillo Sep 30 '21 at 01:22
  • That did the trick. Thank you! – Cadmus Sep 30 '21 at 03:00

0 Answers0