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)