Q4312079q是否可以在带有QGIS3的pyqgis中使用?

当我在QGIS python控制台(2.99)中键入它时,python似乎能够识别它,因为它会自动完成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发行)尝试了此方法。两个版本给出相同的错误。 qgis.core.QgsMapLayerRegistry也不起作用:

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


import是否已在QGIS3中删除?

#1 楼

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

此处列出了3.0 API的更改:

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


QgsMapLayerRegistry:其功能已移至QgsProject。主要原因是QgsMapLayerRegistry是/是一个单例,因此只有一个注册表可能存在。消除了此约束之后,主要障碍便无法实现新事物,例如并排打开多个项目。

评论


我认为答案仍然不完整。

– Abhijit Gujar
18年6月26日在11:34

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

– Matthias Kuhn
18年6月26日在11:46

如果您使用QgsProject.instance()如何解决单例问题?

–米奇·珀尔斯坦(Mickey Perlstein)
18-10-10在16:41

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

– Matthias Kuhn
18-10-14在7:32

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

–米奇·珀尔斯坦(Mickey Perlstein)
18-10-21在10:32

#2 楼

您可以轻松地做同样的事情:

 QgsProject.instance().addMapLayer(your_Qgs_whaterver_Layer)


有关更多详细信息,请参见以下内容:

https://qgis.org /api/classQgsProject.html#a322fce15a4dd7505398ef9d24295f0c1