Las clases Qgs…ComboBox de qgis.gui (PyQGIS)

En el post anterior se agregó a un QDialog una QgsMapLayerComboBox. Esta última es una aplicación de qgis.gui que permite automáticamente, en modo gráfico (con un menú tipo persiana), seleccionar y/o filtrar las layers que se encuentran en el registro de la Map Legend de QGIS sin necesidad de programarla; tal como habría sido necesario si se hubiese diseñado con el QtDesigner.

En este post vamos a considerar la manera de instanciar las aplicaciones similares del tipo Qgs…ComboBox (menús tipo persiana) utilizando un QDialog vacio (sólo con los botones Ok, Cancel) de prueba. Sin embargo, antes vamos a explorar en la Python Console cuantas clases del tipo Qgs…ComboBox existen en qgis.gui. Para ello, se va a usar nuestra ya conocida getPat.

from qgis.gui import *
from utils import getPat
getPat('ComboBox', dir(qgis.gui))
['QgsBlendModeComboBox', 'QgsBrushStyleComboBox', 
'QgsColorRampComboBox', 'QgsEffectDrawModeComboBox', 
'QgsFieldComboBox', 'QgsMapLayerComboBox', 
'QgsPenCapStyleComboBox', 'QgsPenJoinStyleComboBox', 
'QgsPenStyleComboBox', 'QgsScaleComboBox']

lo que arroja un total de 10 de tales clases. Todas ellas presentan el método ‘show’ y se instancian anclándola a un QDialog o como aplicaciones independientes. Para una mejor visualización de éstas, creé el QDialog vacio mediante el código siguiente:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'test_qgis_gui_dialog.ui'
#
# Created: Fri Aug  7 17:16:45 2015
#      by: PyQt4 UI code generator 4.11.2
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(400, 300)
        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
        self.buttonBox.setGeometry(QtCore.QRect(30, 240, 341, 32))
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))

        self.retranslateUi(Dialog)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))

Haciendo una selección arbitraria de 5 de las 10 clases, instancié finalmente:

    QgsMapLayerComboBox,
    QgsFieldComboBox,
    QgsScaleComboBox,
    QgsBrushStyleComboBox y
    QgsPenCapStyleComboBox

El programa principal (test_combo.py) que carga el QDialog como módulo (test_qgis_gui_dialog.py), sin programar conexiones, fue el siguiente:

# -*- coding: utf-8 -*-
from PyQt4 import *
from PyQt4.QtGui import *
from qgis.gui import *
import test_qgis_gui_dialog
from os import chdir
 
class TestGui(QtGui.QDialog):
     
    def __init__(self):
        QtGui.QDialog.__init__(self)
        # Set up the user interface from Designer.
        # After setupUI you can access any designer object by doing:
        # self.<objectname>
        self.ui = test_qgis_gui_dialog.Ui_Dialog()
        self.ui.setupUi(self)
 
# Create the dialog and keep reference
reload(test_qgis_gui_dialog)
 
dlg = TestGui()      #create Dialog object

win1 = QgsMapLayerComboBox(dlg)   #create QgsMapLayerComboBox object
win1.setFixedWidth(231)
win1.move(140,20)

win2 = QgsFieldComboBox(dlg)   #create QgsFieldComboBox object
win2.setFixedWidth(231)
win2.move(140,60)

win3 = QgsScaleComboBox(dlg)   #create QgsScaleComboBox object
win3.setFixedWidth(231)
win3.move(140,100)

win4 = QgsBrushStyleComboBox(dlg)   #create QgsBrushStyleComboBox object
win4.setFixedWidth(231)
win4.move(140,140)

win5 = QgsPenCapStyleComboBox(dlg)   #create QgsPenCapStyleComboBox object
win5.setFixedWidth(231)
win5.move(140,180)

dlg.show()                 #show Dialog object

num_layers = win1.count()

if num_layers == 0:
    print "No hay capas en el registro"

else:
    print "Hay " + str(num_layers) + " capa(s) en el registro"

    layer = iface.activeLayer()

    win2.setLayer(layer)

    num_fields = win2.count()

    print "Hay " + str(num_fields) + " campo(s) en " + layer.name()

    #Create QLabel objects
    label1 = QLabel('Layers', dlg)
    label1.show()
    label1.move(40, 23)

    label2 = QLabel('Fields', dlg)
    label2.show()
    label2.move(40, 63)

    label3 = QLabel('Scale', dlg)
    label3.show()
    label3.move(40, 103)

    label4 = QLabel('Brush Style', dlg)
    label4.show()
    label4.move(40, 143)

    label5 = QLabel('Cap Style', dlg)
    label5.show()
    label5.move(40, 183)

Cargando un shapefile en la Map View de QGIS y ejecutando el script anterior en la Python Console obtuve el resultado siguiente:

Dialog

con la siguiente información complementaria:

>>>execfile(u'/home/zeito/pyqgis_scripts/test_combo'.encode('UTF-8'))
Hay 1 capa(s) en el registro
Hay 23 campo(s) en hancock
Esta entrada fue publicada en PyQGIS, QGIS, Software Libre. Guarda el enlace permanente.

2 respuestas a Las clases Qgs…ComboBox de qgis.gui (PyQGIS)

  1. Pingback: Las clases Qgs…Widget de qgis.gui (PyQGIS) | El Blog de José Guerrero

  2. Pingback: Cómo programar en un Plugin de QGIS una QgsFieldComboBox | El Blog de José Guerrero

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s