Cómo introducir valores numéricos en un plugin de QGIS a través de una QLineEdit

El plugin que aparece en la imagen siguiente ha sido creado mediante el ‘Plugin Builder’ y el código de este post. Utiliza dos tipos de widgets para la “introducción” de información: QgsMapLayerComboBox y QLineEdit. La primera permite seleccionar sólo objetos de la clase QgsRasterLayer porque tiene habilitada un filtro especial para ello. Del segundo tipo existen 4 QLineEdit que hacen posible la introducción de valores numéricos enteros y la última, acoplada con un QFileDialog a través de un QPushButton, permite la selección del directorio y el nombre del ráster resultante.

qlineedit

Por defecto, las QLineEdit permiten introducir sólo texto por lo que, en el caso de la asignación de valores numéricos, es necesario hacer un casting de tipo (string de caracteres a numérico de tipo entero). Sin embargo, cuando se hace esto, aparece un tipo de error que tiene que ser sorteado a través de una instrucción try…except.

Se sugiere que la programación de los Widgets en el plugin se haga en el método __init__. Si se necesita conección al slot entonces la función correspondiente se coloca antes de la definición de run. En este plugin sólo la QLineEdit acoplada a la acción del QFileDialog requiere conexión al slot. Las que se encargan de la introducción de los valores numéricos no. Sin embargo, como a las QLineEDit que solicitan el numero de filas y columnas no se le asignan valores por defecto, cuando se comparan con las que solicitan los valores máximos y mínimos del ráster, decidí que estás últimas tuvieran un color verde ligero como background y parte de su programación está en __init__. El código es el siguiente:

.
.
.
class RandomRaster:
    """QGIS Plugin Implementation."""

    def __init__(self, iface):
        """Constructor.
.
.
.
        wmin = self.dlg.lineEditMinVal
        wmin.setText('1')
        wmin.setAutoFillBackground(True)
        p = wmin.palette()
        p.setColor(wmin.backgroundRole(), QColor('light green'))
        wmin.setPalette(p)
        
        wmax = self.dlg.lineEditMaxVal
        wmax.setText('10')
        wmax.setAutoFillBackground(True)
        p = wmax.palette()
        p.setColor(wmax.backgroundRole(), QColor('light green'))
        wmax.setPalette(p)
.
.
.

El resto de la implementación está en el bloque try prácticamente al final del trozo de código siguiente:

.
.
.
    def select_output_file(self):
        filename = QFileDialog.getSaveFileName(self.dlg, "Select output file ","", '*.tif')
        ext = ".tif"
        ext_filename = filename[-4:]
        
        if ext_filename != ext:
            filename += ext 
        
        self.dlg.lineEdit.setText(filename)

    def run(self):
        """Run method that performs all the real work"""

        layer = self.wcb.currentLayer()
        
        if layer is None:
            self.iface.messageBar().pushMessage("Warning: ",
                                           "There is not an Active Layer",
                                           QgsMessageBar.WARNING, 5)

            return
        
        # show the dialog
        self.dlg.show()
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result:
            # Do something useful here - delete the line containing pass and
            # substitute with your code.
            provider = layer.dataProvider()
     
            my_path= provider.dataSourceUri()
            
            (root, filename) = os.path.split(my_path)
            
            dataset = gdal.Open(my_path)

            prj = dataset.GetProjection()
            
            band = dataset.GetRasterBand(1)
            
            #Get raster metadata
         
            #geotransform[0] = top left x
            #geotransform[1] = w-e pixel resolution
            #geotransform[3] = top left y
            #geotransform[5] = n-s pixel resolution
             
            geotransform = dataset.GetGeoTransform()

            # Set name of output raster
            output_file = self.dlg.lineEdit.text()

            # Create gtif file with rows and columns from parent raster 
            driver = gdal.GetDriverByName("GTiff")
            
            try:
                rows = int( self.dlg.lineEditRows.text() )
                columns = int( self.dlg.lineEditColumns.text() )
                v_min = int( self.dlg.lineEditMinVal.text() )            
                v_max = int( self.dlg.lineEditMaxVal.text() )
.
.
.
            except ValueError:
                message = "Please, choose an integer number"
                self.iface.messageBar().pushMessage("Warning:",
                                                    message,
                                                    QgsMessageBar.WARNING, 5)
            except AttributeError:
                message = "Please, choose one name for the file"
                self.iface.messageBar().pushMessage("Warning:",
                                                    message,
                                                    QgsMessageBar.WARNING, 5)
           
                #My code ends here

De las excepciones al final del código anterior, la primera advierte el hecho de que no se han introducido números enteros como caracteres. Aún si se introducen números en coma flotante éstos no serán objeto de conversión entera. Por otra parte, la segunda excepción advierte que no se ha escogido un nombre de archivo válido para guardar el ráster resultante; aunque si no se añade una extensión *.tif ésta será añadida automáticamente en el slot.

Esta entrada fue publicada en PyQGIS, QGIS, SIG, 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