Cómo usar una QProgressBar en un Plugin de QGIS

Lo maravilloso de la programación orientada a objetos es que permite la modificación ulterior del código con poco esfuerzo. Por ejemplo, en un post pasado, había planteado cómo obtener un vectorial de puntos con valores escogidos de un ráster mediante PyQGIS. Este código lo había plasmado en un plugin pero no había programado adecuadamente el botón OK y lo hice en esta oportunidad fácilmente.

Por otra parte, como le había añadido una QgsMessageBar que me advirtiese de la finalización exitosa del proceso y esta, para algunos casos, tardaba en aparecer dando la sensación de aparente inactividad, creí necesario la inclusión de una QProgressBar.

La QProgressBar puede añadirse fácilmente con el QtDesigner, sin embargo, mantiene unos valores por defecto (24 %) que hay que resetear. Por tanto, hay que instanciar el objeto en el método __init__; tal como se señala a continuación:

.
.
.
    def __init__(self, iface):
.
.
.
        pb = self.dlg.progressBar
        pb.setValue(0)
        pb.setRange(0,100)
.
.
.
    def points_raster(self):  #slot function
.
.
.
            i = 0
                
            for row in range(rows):
                self.dlg.progressBar.setValue( i + 1 ) #Progress Bar
                for col in range(columns):
                    if  (value == numpy_array[row,col]):
                        #Add new point:
                        x = col * x_size + upper_left_x + (x_size / 2) #add half the cell size
                        y = row * y_size + upper_left_y + (y_size / 2) #to centre the point
                        fet.setGeometry(QgsGeometry.fromPoint(QgsPoint(x,y)))
                        fet.initAttributes(4)
                        fet.setAttribute(0, i)
                        fet.setAttribute(1, float(numpy_array[row,col]))
                        fet.setAttribute(2, row)
                        fet.setAttribute(3, col)
                        pr.addFeatures( [ fet] )
                            
                        i += 1

            # Commit changes
            memory_layer.commitChanges()
.
.
.

Una vez instanciado el objeto hay que ubicar en la función slot ‘points_raster’ (programación de la ejecución al hacer click en OK) cuál es el “paso lento” del proceso. En este caso, corresponde al bucle de la creación de los features de la memory layer de puntos; sobre todo si son varios miles de ellos. Allí fue ubicado el objeto (QProgressBar); tal como se comenta en el código de arriba.

Una vez recargado el plugin, comprobamos las modificaciones y estas me parecieron aceptables; tal como se evidencia en la imagen siguiente:

progress_bar1

Esta entrada fue publicada en Plugin, PyQGIS, QGIS, Software Libre. Guarda el enlace permanente.

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