I am trying to create plugin that will open new window with some layer, Dynamically "pan" my window, when main window is pan. So boundingbox coordinates should be the same in both windows.
I need new window to move with main QGIS window. I've found out in documentation useful code for map canvas:
import sys, os
class MyWnd(QMainWindow):
def __init__(self, layer):
QMainWindow.__init__(self)
self.canvas = QgsMapCanvas()
self.canvas.setCanvasColor(QtCore.Qt.white)
self.canvas.setExtent(layer.extent())
self.canvas.setLayerSet([QgsMapCanvasLayer(layer)])
self.setCentralWidget(self.canvas)
actionZoomIn = QAction("Zoom in", self)
actionZoomOut = QAction("Zoom out", self)
actionPan = QAction("Pan", self)
actionZoomIn.setCheckable(True)
actionZoomOut.setCheckable(True)
actionPan.setCheckable(True)
self.connect(actionZoomIn, QtCore.SIGNAL("triggered()"), self.zoomIn)
self.connect(actionZoomOut, QtCore.SIGNAL("triggered()"), self.zoomOut)
self.connect(actionPan, QtCore.SIGNAL("triggered()"), self.pan)
self.toolbar = self.addToolBar("Canvas actions")
self.toolbar.addAction(actionZoomIn)
self.toolbar.addAction(actionZoomOut)
self.toolbar.addAction(actionPan)
# create the map tools
self.toolPan = QgsMapToolPan(self.canvas)
self.toolPan.setAction(actionPan)
self.toolZoomIn = QgsMapToolZoom(self.canvas, False) # false = in
self.toolZoomIn.setAction(actionZoomIn)
self.toolZoomOut = QgsMapToolZoom(self.canvas, True) # true = out
self.toolZoomOut.setAction(actionZoomOut)
self.pan()
def zoomIn(self):
self.canvas.setMapTool(self.toolZoomIn)
def zoomOut(self):
self.canvas.setMapTool(self.toolZoomOut)
def pan(self):
self.canvas.setMapTool(self.toolPan)
And using class below I get coordinates from main canvas and set coordinates to my canvas (part of QGIS plugin):
def run(self):
"""Run method"""
import re
wnd = MyWnd(self.iface.activeLayer())
wnd.show()
canv = qgis.utils.iface.mapCanvas()
coords = canv.mapRenderer().extent().toString()
coords = re.findall("([0-9]*\.[0-9]*)", coords)
wnd.canvas.setExtent(QgsRectangle(float(coords[0]), float(coords[1]), float(coords[2]),float(coords[3])))
wnd.canvas.refresh()
I think this part of code can be used in loop (if coordinates change - I will set new coordinates in own canvas). But I don't sure if it is a good way.
Is there any other way to solve this issue? Provide me with right way, please.