是否在QGIS3中删除了QgsMapLayerRegistry?


20

QgsMapLayerRegistry要在与QGIS3 pyqgis速效

当我在QGIS python控制台(2.99)中键入它时,python似乎可以识别它,因为它会自动完成qgis.core.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>
AttributeError: module 'qgis.core' has no attribute 'QgsMapLayerRegistry'

我用两个版本的QGIS 2.99进行了尝试(一个版本是01/07,然后是06/17)。两个版本给出相同的错误。import也不起作用:

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

QgsMapLayerRegistry在QGIS3中被删除了吗?

Answers:


27

是的,它已被删除,但存在替代方法。

这里列出了3.0 API的更改:

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

QgsMapLayerRegistry其功能已移至QgsProject

主要原因是QgsMapLayerRegistry是/是一个单例,因此只能存在一个注册表。消除了此限制后,主要障碍便无法实现,例如并排打开多个项目。


我认为答案仍然不完整。
Abhijit Gujar

2
我认为您需要提供更多信息,为什么您认为答案仍然不完整。
Matthias Kuhn,

如果您使用QgsProject.instance()如何解决单例问题?
米奇·佩尔斯坦

@MickeyPerlstein是正确的,如果使用QgsProject.instance()则无法解决。但是,独立的应用程序现在已经可以与多个项目一起实现,并且QGIS服务器代码也朝这个方向移动。从长远来看,QgsProject.instance()可能会完全消失。
Matthias Kuhn '18

我不明白从一个零件上的一个单例转移到另一零件上的一个单例如何改变运行多个实例的能力(无论如何,接收一个相同的单例实例(根据定义)...拥有一个单例更有意义吗?单实例应用程序可以运行实例吗?这也将使互操作性和可扩展性更加容易(类似于Microsoft Office SDK,您可以在其中连接到现有的打开的Office实例或打开一个新实例
Mickey Perlstein,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.