[DBManager] remove layers from QgsMapLayerRegistry once refreshing a table, previewing a different layer or closing the DBManager main window (fix #12938)

This commit is contained in:
Giuseppe Sucameli 2015-09-04 23:50:05 +02:00
parent e6f4fa6bad
commit eea81e81c5
2 changed files with 22 additions and 16 deletions

View File

@ -58,6 +58,8 @@ class DBManager(QMainWindow):
def closeEvent(self, e): def closeEvent(self, e):
self.unregisterAllActions() self.unregisterAllActions()
# clear preview, this will delete the layer in preview tab
self.preview.loadPreview(None)
# save the window state # save the window state
settings = QSettings() settings = QSettings()
@ -82,6 +84,8 @@ class DBManager(QMainWindow):
QApplication.setOverrideCursor(Qt.WaitCursor) QApplication.setOverrideCursor(Qt.WaitCursor)
try: try:
self.reloadButtons() self.reloadButtons()
# clear preview, this will delete the layer in preview tab
self.preview.loadPreview(None)
self.refreshTabs() self.refreshTabs()
except BaseError as e: except BaseError as e:
DlgDbError.showError(e, self) DlgDbError.showError(e, self)

View File

@ -38,6 +38,7 @@ class LayerPreview(QgsMapCanvas):
self.item = None self.item = None
self.dirty = False self.dirty = False
self.currentLayer = None
# reuse settings from QGIS # reuse settings from QGIS
settings = QSettings() settings = QSettings()
@ -46,8 +47,6 @@ class LayerPreview(QgsMapCanvas):
zoomFactor = settings.value("/qgis/zoom_factor", 2, type=float) zoomFactor = settings.value("/qgis/zoom_factor", 2, type=float)
self.setWheelAction(QgsMapCanvas.WheelAction(action), zoomFactor) self.setWheelAction(QgsMapCanvas.WheelAction(action), zoomFactor)
self._clear()
def refresh(self): def refresh(self):
self.setDirty(True) self.setDirty(True)
self.loadPreview(self.item) self.loadPreview(self.item)
@ -80,19 +79,18 @@ class LayerPreview(QgsMapCanvas):
self.disconnect(self.item, SIGNAL('aboutToChange'), self.setDirty) self.disconnect(self.item, SIGNAL('aboutToChange'), self.setDirty)
except RuntimeError: except RuntimeError:
pass pass
self.item = None self.item = None
self.dirty = False self.dirty = False
self._loadTablePreview(None)
self.currentLayerId = None
self.setLayerSet([])
def _loadTablePreview(self, table, limit=False): def _loadTablePreview(self, table, limit=False):
""" if has geometry column load to map canvas """ """ if has geometry column load to map canvas """
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
self.setRenderFlag(False) self.setRenderFlag(False)
newLayerId = None vl = None
if table.geomType: if table and table.geomType:
# limit the query result if required # limit the query result if required
if limit and table.rowCount > 1000: if limit and table.rowCount > 1000:
uniqueField = table.getValidQGisUniqueFields(True) uniqueField = table.getValidQGisUniqueFields(True)
@ -112,17 +110,21 @@ class LayerPreview(QgsMapCanvas):
vl = table.toMapLayer() vl = table.toMapLayer()
if not vl.isValid(): if not vl.isValid():
self.setLayerSet([]) vl.deleteLater()
else: vl = None
newLayerId = vl.id() if hasattr(vl, 'id') else vl.id()
# remove old layer (if any) and set new
if self.currentLayer:
QgsMapLayerRegistry.instance().removeMapLayers([self.currentLayer.id()])
if vl:
self.setLayerSet([QgsMapCanvasLayer(vl)]) self.setLayerSet([QgsMapCanvasLayer(vl)])
QgsMapLayerRegistry.instance().addMapLayers([vl], False) QgsMapLayerRegistry.instance().addMapLayers([vl], False)
self.zoomToFullExtent() self.zoomToFullExtent()
else:
self.setLayerSet([])
# remove old layer (if any) and set new self.currentLayer = vl
if self.currentLayerId:
QgsMapLayerRegistry.instance().removeMapLayers([self.currentLayerId], False)
self.currentLayerId = newLayerId
self.setRenderFlag(True) self.setRenderFlag(True)
QApplication.restoreOverrideCursor() QApplication.restoreOverrideCursor()