jueves, 13 de julio de 2017

Ejemplo de QgsFieldComboBox.setFilters() en la creación de un plugin con PyQGIS

Los objetos de QgsFieldComboBox (menús tipo persiana para campos de archivos vectoriales) aceptan filtros de la clase QgsFieldProxyModel para desplegar sólo aquellos que tengan un tipo determinado (All, Date, Double, Int, LongLong, Numeric, String, Time). El único cuidado que hay que tener es establecer la debida conexión al slot (función) que permita actualizar los campos cada vez que cambia la capa vectorial.

El código siguiente ha sido preparado para ejecutarse en la Python Console de QGIS. La colocación de las líneas en las funciones respectivas del plugin (__init__, initGui, run, etc) queda por parte del lector.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from qgis.gui import QgsMapLayerComboBox
from qgis.gui import QgsFieldComboBox
from qgis.gui import QgsFieldProxyModel

def select_layer_fields(vlayer):
    wcbF.setLayer(vlayer)
    field = wcbF.setLayer(vlayer)

wcbL = QgsMapLayerComboBox()
wcbL.move(600,200)
wcbL.setMinimumWidth(203)
wcbL.show()

wcbF = QgsFieldComboBox()
wcbF.move(600,300)
wcbF.setMinimumWidth(203)
wcbF.setFilters(QgsFieldProxyModel.String) #All, Date, Double, Int, LongLong, Numeric, String, Time
wcbF.show()

vlayer = wcbL.currentLayer()                      #run method
wcbF.setLayer(vlayer)                             #run method
wcbL.layerChanged.connect(select_layer_fields)    #run method

La ejecución del código anterior en la Python Console de QGIS con dos vectoriales previamente cargados (tipo punto y polígono; respectivamente), que contienen un sólo campo de tipo 'String', producen el siguiente resultado para el caso del vectorial de puntos.


y este otro para el vectorial tipo polígono.


El filtro QgsFieldProxyModel.String actuó tal como se esperaba. Otras posibilidades de filtros están en los sufijos: All, Date, Double, Int, LongLong, Numeric, Time.

No hay comentarios: