¿QgsMapLayerRegistry se elimina en QGIS3?

20

Se QgsMapLayerRegistryva a ser availabe en PyQGIS con QGIS3

Cuando lo escribí en la consola QGIS python (2.99), python parece reconocerlo porque se completa automáticamente qgis.core.QgsMapLayerRegistry, pero luego da un error de que no está allí:

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'

Probé esto con dos versiones de QGIS 2.99 (una en 01/07 y en 17/06). Ambas versiones dan el mismo error. importtampoco funciona:

>>>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'

¿Se QgsMapLayerRegistryelimina en QGIS3?

tinlyx
fuente

Respuestas:

27

Sí, se ha eliminado, pero existen alternativas.

Los cambios de la API 3.0 se enumeran aquí:

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

QgsMapLayerRegistry: Su funcionalidad se ha trasladado a QgsProject.

La razón principal es que QgsMapLayerRegistry es / era un singleton y, por lo tanto, solo podría existir un único registro. Con esta restricción eliminada, los principales obstáculos están fuera del camino para implementar cosas nuevas como tener múltiples proyectos abiertos uno al lado del otro.

Matthias Kuhn
fuente
Creo que la respuesta aún está incompleta.
Abhijit Gujar
2
Creo que necesita dar más información por qué cree que la respuesta aún está incompleta.
Matthias Kuhn el
si usa QgsProject.instance (), ¿cómo resuelve eso el problema de singleton?
Mickey Perlstein
@MickeyPerlstein tiene razón, si usa QgsProject.instance () no se resuelve. Sin embargo, las aplicaciones independientes ya se pueden implementar con múltiples proyectos y el código del servidor QGIS también se mueve en esta dirección. A la larga, QgsProject.instance () podría desaparecer por completo.
Matthias Kuhn el
No entiendo cómo pasar de usar un singleton en una parte a un singleton en otra parte cambia la capacidad de ejecutar varias instancias (que de todos modos reciben la misma instancia de singleton (por definición) ... ¿no tendría más sentido tener un ¿Aplicación única que obtiene instancias en ejecución? Esto también permitiría una interopabilidad y extensibilidad mucho más fáciles (algo así como Microsoft Office SDK donde puede conectarse a una instancia abierta de oficina existente o abrir una nueva instancia
Mickey Perlstein