QgsMapLayerRegistry è stato rimosso in QGIS3?


20

Sta QgsMapLayerRegistryandando essere availabe in PyQGIS con QGIS3

Quando l'ho digitato nella console Python di QGIS (2.99), Python sembra riconoscerlo perché si completa automaticamente qgis.core.QgsMapLayerRegistry, ma poi dà un errore che non c'è:

Traceback (most recent call last):
  File "/usr/lib/python3.5/code.py", line 91, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
AttributeError: module 'qgis.core' has no attribute 'QgsMapLayerRegistry'

Ho provato questo con due versioni di QGIS 2.99 (una nel 01/07 e in poi il 17/06). Entrambe le versioni danno lo stesso errore. importnon funziona neanche:

>>>from qgis.core import QgsMapLayerRegistry
Traceback (most recent call last):
  File "/usr/lib/python3.5/code.py", line 91, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
ImportError: cannot import name 'QgsMapLayerRegistry'

Viene QgsMapLayerRegistryrimosso in QGIS3?

Risposte:


27

Sì, è stato rimosso, ma esistono alternative.

Le modifiche all'API 3.0 sono elencate qui:

https://qgis.org/api/api_break.html

QgsMapLayerRegistry: La sua funzionalità è stata spostata in QgsProject.

Il motivo principale è che QgsMapLayerRegistry è / era un singleton e quindi potrebbe esistere un solo registro. Con questo vincolo rimosso, i principali blocchi stradali sono fuori mano per implementare nuove cose come l'apertura di più progetti fianco a fianco.


penso che la risposta sia ancora incompleta.
Abhijit Gujar,

2
Penso che tu debba fornire maggiori informazioni sul perché pensi che la risposta sia ancora incompleta.
Matthias Kuhn,

se usi QgsProject.instance () come risolve il problema singleton?
Mickey Perlstein,

@MickeyPerlstein hai ragione, se usi QgsProject.instance () non è risolto. Tuttavia, le app autonome possono già essere implementate con più progetti e anche il codice del server QGIS viene spostato in questa direzione. A lungo termine QgsProject.instance () potrebbe scomparire completamente.
Matthias Kuhn,

non capisco come il passaggio dall'uso di un singleton su una parte a un singleton su un'altra parte cambi la capacità di eseguire più istanze (che comunque ricevono la stessa istanza singleton (per definizione) ... non avrebbe più senso avere un app singleton che ottiene istanze in esecuzione? ciò consentirebbe anche un'interoperabilità e un'estensibilità molto più facili (un po 'come microsoft office sdk in cui è possibile connettersi a un'istanza aperta esistente di office o aprire una nuova istanza
Mickey Perlstein,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.