def setRoot(self, root): model = QgsLayerTreeModel(root, self) model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility) model.setFlag(QgsLayerTreeModel.ShowLegendAsTree) font = QFont() font.setPointSize(20) model.setLayerTreeNodeFont(QgsLayerTreeNode.NodeLayer, font) model.setLayerTreeNodeFont(QgsLayerTreeNode.NodeGroup, font) self.layerTree.setModel(model) for layer_node in model.rootGroup().findLayers(): layer = layer_node.layer() if layer.type() == QgsMapLayer.VectorLayer: if layer.geometryType() == QgsWkbTypes.NullGeometry: parent = layer_node.parent() parent.removeLayer(layer)
class AuxiliaryLegend(QDockWidget): currentLayerChanged = pyqtSignal("QgsMapLayer") currentLayerQgis = pyqtSignal("QgsMapLayer") syncGroupLayer = pyqtSignal() addSelectedLayersQgis = pyqtSignal() removeLayer = pyqtSignal("QgsMapLayer") needSelectLayer = pyqtSignal() closed = pyqtSignal() def __init__(self, parent, numWin): def setTreeView(): def setModel(): self.model = QgsLayerTreeModel(ltg) self.model.setFlag(QgsLayerTreeModel.AllowNodeReorder) self.model.setFlag(QgsLayerTreeModel.AllowNodeChangeVisibility, True) self.tview.setModel(self.model) self.tview = QgsLayerTreeView(self) self.tview.setSelectionMode(QAbstractItemView.ExtendedSelection) setModel() self.tview.currentLayerChanged.connect( self.currentLayerChanged.emit) def setupUi(): self.setAllowedAreas(Qt.LeftDockWidgetArea) winLegend.setWindowFlags(Qt.Widget) toolBar.setFloatable(False) toolBar.setMovable(False) winLegend.addToolBar(toolBar) self.setWidget(winLegend) def addActions(): actn = QAction(winLegend) actn.setIcon(qgis.utils.iface.actionShowSelectedLayers().icon()) actn.setIconText('Show selected layers') actn.setObjectName('showLayer') actn.triggered.connect(self.onAction) toolBar.addAction(actn) actn = QAction(winLegend) actn.setIcon(qgis.utils.iface.actionHideSelectedLayers().icon()) actn.setIconText('Hide selected layers') actn.setObjectName('hideLayer') actn.triggered.connect(self.onAction) toolBar.addAction(actn) actn = QAction(winLegend) actn.setIcon(qgis.utils.iface.actionRemoveLayer().icon()) actn.setIconText('Remove selected layers') actn.setObjectName('removeLayer') actn.triggered.connect(self.onAction) toolBar.addAction(actn) toolBar.addSeparator() actn = QAction(winLegend) actn.setIcon(qgis.utils.iface.actionDuplicateLayer().icon()) actn.setIconText('Add selected layers from main map') actn.setObjectName('addLayer') actn.triggered.connect(self.onAction) toolBar.addAction(actn) actn = QAction(winLegend) actn.setIcon( QIcon( os.path.join(os.path.dirname(__file__), 'mActionCurrentLayer.png'))) actn.setIconText('Current layer for main map') actn.setObjectName('currentLayer') actn.triggered.connect(self.onAction) toolBar.addAction(actn) actn = QAction(winLegend) actn.setIcon( QIcon( os.path.join(os.path.dirname(__file__), 'mActionAddGroup.png'))) actn.setObjectName('syncGroup') actn.triggered.connect(self.onAction) toolBar.addAction(actn) super(AuxiliaryLegend, self).__init__("#%d - Layers" % numWin, parent) ltg = parent.ltg self.tview = self.model = self.bridge = None self.textSync = "Sync with group(main map) for new layers" self.actSync = None setTreeView() winLegend = QMainWindow(self) toolBar = QToolBar(winLegend) setupUi() addActions() self.addNameSyncGroup("None") winLegend.setCentralWidget(self.tview) def addNameSyncGroup(self, name): act = self.findChild(QAction, 'syncGroup') text = "%s -> %s" % (self.textSync, name) act.setIconText(text) def setBridge(self, canvas): ltg = self.model.rootGroup() self.bridge = QgsLayerTreeMapCanvasBridge( ltg, canvas) # Need wait populate ltg def clearBridge(self): if not self.bridge is None: self.bridge.clear() def closeEvent(self, event): event.accept() self.closed.emit() @pyqtSlot() def onAction(self): nameSender = self.sender().objectName() if nameSender in ('showLayer', 'hideLayer', 'removeLayer'): nodes = self.tview.selectedLayerNodes() if len(nodes) == 0: self.needSelectLayer.emit() return if nameSender in ('showLayer', 'hideLayer'): checked = Qt.Checked if nameSender == 'showLayer' else Qt.Unchecked map(lambda item: item.setVisible(checked), nodes) else: ltg = self.model.rootGroup() for node in nodes: self.removeLayer.emit(node.layer()) ltg.removeChildNode(node) # addLayer, currentLayer else: if nameSender == 'addLayer': self.addSelectedLayersQgis.emit() elif nameSender == 'currentLayer': self.currentLayerQgis.emit(self.tview.currentLayer()) else: self.syncGroupLayer.emit()
class AuxiliaryLegend( QDockWidget ): currentLayerChanged = pyqtSignal( "QgsMapLayer" ) currentLayerQgis = pyqtSignal( "QgsMapLayer" ) syncGroupLayer = pyqtSignal() addSelectedLayersQgis = pyqtSignal() removeLayer = pyqtSignal( "QgsMapLayer" ) needSelectLayer = pyqtSignal() closed = pyqtSignal() def __init__( self, parent, numWin ): def setTreeView(): def setModel(): self.model = QgsLayerTreeModel( ltg ) self.model.setFlag( QgsLayerTreeModel.AllowNodeReorder ) self.model.setFlag( QgsLayerTreeModel.AllowNodeChangeVisibility, True ) self.tview.setModel( self.model ) self.tview = QgsLayerTreeView( self ) self.tview.setSelectionMode( QAbstractItemView.ExtendedSelection ) setModel() self.tview.currentLayerChanged.connect( self.currentLayerChanged.emit ) def setupUi(): self.setAllowedAreas( Qt.LeftDockWidgetArea ) winLegend.setWindowFlags( Qt.Widget ) toolBar.setFloatable( False ) toolBar.setMovable( False ) winLegend.addToolBar( toolBar ) self.setWidget( winLegend ) def addActions(): actn = QAction( winLegend ) actn.setIcon( qgis.utils.iface.actionShowSelectedLayers().icon() ) actn.setIconText( 'Show selected layers') actn.setObjectName( 'showLayer') actn.triggered.connect( self.onAction ) toolBar.addAction( actn ) actn = QAction( winLegend ) actn.setIcon( qgis.utils.iface.actionHideSelectedLayers().icon() ) actn.setIconText( 'Hide selected layers') actn.setObjectName( 'hideLayer') actn.triggered.connect( self.onAction ) toolBar.addAction( actn ) actn = QAction( winLegend ) actn.setIcon( qgis.utils.iface.actionRemoveLayer().icon() ) actn.setIconText( 'Remove selected layers') actn.setObjectName( 'removeLayer') actn.triggered.connect( self.onAction ) toolBar.addAction( actn ) toolBar.addSeparator() actn = QAction( winLegend ) actn.setIcon( qgis.utils.iface.actionDuplicateLayer().icon() ) actn.setIconText( 'Add selected layers from main map') actn.setObjectName( 'addLayer') actn.triggered.connect( self.onAction ) toolBar.addAction( actn ) actn = QAction( winLegend ) actn.setIcon( QIcon( os.path.join( os.path.dirname(__file__), 'mActionCurrentLayer.png' ) ) ) actn.setIconText( 'Current layer for main map') actn.setObjectName( 'currentLayer') actn.triggered.connect( self.onAction ) toolBar.addAction( actn ) actn = QAction( winLegend ) actn.setIcon( QIcon( os.path.join( os.path.dirname(__file__), 'mActionAddGroup.png' ) ) ) actn.setObjectName( 'syncGroup' ) actn.triggered.connect( self.onAction ) toolBar.addAction( actn ) super( AuxiliaryLegend, self ).__init__( "#%d - Layers" % numWin, parent ) ltg = parent.ltg self.tview = self.model = self.bridge = None self.textSync = "Sync with group(main map) for new layers" self.actSync = None setTreeView() winLegend = QMainWindow( self ) toolBar = QToolBar( winLegend ) setupUi() addActions() self.addNameSyncGroup( "None" ) winLegend.setCentralWidget( self.tview ) def addNameSyncGroup(self, name): act = self.findChild( QAction, 'syncGroup' ) text = "%s -> %s" % ( self.textSync, name ) act.setIconText( text ) def setBridge(self, canvas): ltg = self.model.rootGroup() self.bridge = QgsLayerTreeMapCanvasBridge( ltg, canvas ) # Need wait populate ltg def clearBridge(self): if not self.bridge is None: self.bridge.clear() def closeEvent(self, event): event.accept() self.closed.emit() @pyqtSlot() def onAction(self): nameSender = self.sender().objectName() if nameSender in ( 'showLayer', 'hideLayer', 'removeLayer'): nodes = self.tview.selectedLayerNodes() if len( nodes ) == 0: self.needSelectLayer.emit() return if nameSender in ( 'showLayer', 'hideLayer'): checked = Qt.Checked if nameSender == 'showLayer' else Qt.Unchecked map( lambda item: item.setVisible( checked ), nodes ) else: ltg = self.model.rootGroup() for node in nodes: self.removeLayer.emit( node.layer() ) ltg.removeChildNode( node ) # addLayer, currentLayer else: if nameSender == 'addLayer': self.addSelectedLayersQgis.emit() elif nameSender == 'currentLayer': self.currentLayerQgis.emit( self.tview.currentLayer() ) else: self.syncGroupLayer.emit()