miércoles, 28 de febrero de 2018

QFileDialog del tipo 'getSaveFileName' en un plugin con PyQGIS3

En estos primeros días de trabajo con PyQGIS3 se ha podido comprobar que si no se asume una estrategia de "divide y vencerás" tendremos problemas en la migración de nuestros viejos plugins a la nueva versión de QGIS. La adaptación del código Python puro y de las clases de QGIS no reviste tanta dificultad como la relacionada a los elementos PyQt; los cuales abordaremos a continuación.

En la imagen siguiente se observa el comienzo de la creación desde cero de un plugin para generar rásters con valores aleatorios y alineados con un ráster base. Los elementos Qt que contiene, además de los botones OK y Cancel, son un QLabel, una QLineEdit y un QPushButton conectado en segundo plano a un QFileDialog del tipo 'getSaveFileName'.


A diferencia de la versión anterior de PyQt, ahora QFileDialog no está en QtGui sino en QtWidgets. Otro cambio importante es que la salida del tipo 'getSaveFileName' no se maneja como un string simple sino como una tupla de strings donde el primer componente es el paso completo al archivo y el segundo la extensión. El código condensado en el plugin que hace que éste funcione aceptablemente se presenta a continuación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
.
.
.
from PyQt5.QtWidgets import QAction, QFileDialog
.
.
.
    def add_action(
        self,
        icon_path,
        text,
        callback,
        enabled_flag=True,
        add_to_menu=True,
        add_to_toolbar=True,
        status_tip=None,
        whats_this=None,
        parent=None):
.
.
.
        self.dlg.lineEdit.clear()
        self.dlg.pushButton.clicked.connect(self.select_output_file)

        okBtn = self.dlg.okButton
        okBtn.clicked.connect(self.input_values)

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

Cuando se ejecuta el plugin y se hace click en el QPushButton asociado al QFileDialog (botón con ...) éste permite navegar hasta el directorio que albergará nuestro archivo de salida. Una vez seleccionado el nombre, al hacer click en "Guardar" se adiciona a la QLineEdit el paso completo; tal como se aprecia en la imagen de arriba.

No hay comentarios: