Solución:
Hay una forma recomendada de hacer esto: use el widget personalizado incorporado llamado QgsMapLayerComboBox
.
Puede encontrarlo en Qt Designer bajo el QGIS custom widgets
grupo.
Una vez que abra el cuadro de diálogo en QGIS, el cuadro combinado se llenará con todas las capas en el QgsProject
. QgsMapLayerComboBox
ofrece métodos prácticos para filtrar dicha lista (consulte los documentos).
Cuando esté listo para leer y usar la capa seleccionada, por ejemplo, después de que los usuarios acepten el diálogo, puede acceder a la capa seleccionada de esta manera:
layer = self.dlg.mMapLayerComboBox.currentLayer() # Real QgsMapLayer object
¡Y eso es!
Anexo: ¿Por qué falla su código?
Usando un Qt ComboBox normal, tiene varias opciones para acceder a una capa seleccionada en el cuadro combinado. La mejor forma es utilizar my_combo_box.addItem(layer_name, layer_object)
En lugar de usar my_combo_box.addItems(...)
para llenar el cuadro combinado.
De esta manera, puede obtener acceso directo a la capa seleccionada utilizando
layer = self.dlg.comboBox.currentData()
Puede acceder a la actual texto en tus QComboBox
vía
lyr_name = my_combo.currentText()
y la capa a través de
the_layer = QgsProject.instance().mapLayersByName(lyr_name)[0]
mapLayersByName()
El método devuelve una lista porque QGIS puede manejar varias capas con el mismo nombre. Por lo tanto, a menudo uso [0]
porque en la mayoría de mis casos los nombres de las capas son únicos.
Referencia: https://qgis.org/api/classQgsProject.html#a935efacacb942a15afe19728233e35c3
Recomiendo la respuesta de Germán Carrillo. Estoy agregando otra forma de obtener estos widgets personalizados, por si acaso no aparece en QtDesigner, en el menú de la izquierda.
Puede utilizar un QComboBox normal en QtDesigner. Luego haga clic derecho sobre él y elija Promote to...
.
Luego puede agregar widgets personalizados:
Name of base class: `QComboBox`
Name of promoted class: `QgsMapLayerComboBox`
Header: `qgis.gui`