Widget, botón y señales en PyQGIS con QtDesigner

En un post anterior describimos la forma de realizar una pequeña aplicación que, ejecutada en la Python Console de QGIS, dibujaba en la pantalla un Widget (QWidget) con su respectivo botón (QPushButton); objetos pertenecientes a la clase PyQt4.QtGui. Además, la respectiva aplicación generaba una señal cuando se hacía click en el botón que permitía llamar a una función que generaba un mensaje de aviso de que ésto había sido realizado y cerraba la aplicación.

En el presente post vamos a generar una aplicación similar pero, en lugar de generar todo el código desde cero, se empleará el QtDesigner; que es una herramienta para diseñar interfaces gráficas de usuario (GUIs) a partir de componentes Qt. Los archivos que se generan son del tipo marcado XML y tienen la extensión *.ui. La última versión Windows de QGIS (2.10 Pisa) genera automáticamente durante la instalación accesos directos en el escritorio al QtDesigner y a la Consola de OSGeo4W; esta última necesaria para compilar los archivos de extensión *.ui a lenguaje Python (para que puedan ser usados en el programa principal). En versiones anteriores de QGIS sólo cabe mencionar que los ejecutables para estas aplicaciones están en la carpeta bin de QGIS.

La imagen siguiente refleja una ventana Dialog a la cual, en el archivo que se crea por defecto al abrir la aplicación, se han eliminado los botones (Ok, Cancel) y añadido un Push Button (con el texto por defecto cambiado a “Prueba”). Además, se visualiza la aplicación en modo de ejecución (menú View).

designer1

Como el uso del QtDesigner permite agilizar el diseño de aplicaciones para los Plugins de QGIS, voy a utilizar la misma nomenclatura para nombrar los archivos *.ui que emplea la plantilla de Plugins (Plugin Builder) de QGIS. Como mi aplicación principal la voy a llamar widget_button, voy a grabar la aplicación de la imagen anterior con el nombre de ui_widget_button_dialog_base.ui en C:\pyqgis_scripts.

El comando de compilación del archivo puede observarse en la imagen siguiente:

designer2

y el código generado (widget_button_dialog.py) fue el siguiente:

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

# Form implementation generated from reading ui file 'ui_widget_button_dialog_base.ui'
#
# Created: Wed Aug 05 09:51:05 2015
#      by: PyQt4 UI code generator 4.11.3
#
# 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(395, 198)
        self.pushButton = QtGui.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(150, 80, 91, 41))
        font = QtGui.QFont()
        font.setPointSize(18)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName(_fromUtf8("pushButton"))

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

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

La aplicación principal, que carga a la anterior como módulo, se da a continuación:

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
from qgis.gui import QgsMessageBar
import widget_button_dialog


class WidgetButton(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 = widget_button_dialog.Ui_Dialog()
        self.ui.setupUi(self)

    def openForm(self):
        self.show()

    def testSignal(self):
     
        iface.messageBar().pushMessage("Aviso: ", 
                                       u"El botón ha sido clickado", 
                                       QgsMessageBar.INFO, 5)
     
        self.close()

# Create the dialog and keep reference
reload(widget_button_dialog)
dlg = WidgetButton()

dlg.openForm()

btn = dlg.ui.pushButton

print btn.objectName()

btn.clicked.connect(dlg.testSignal)

Cuando se ejecuta la aplicación anterior (widget_button.py) en la Python Console de QGIS se obtiene lo siguiente:

designer3

Cuando se hace click en el botón “Prueba” se cierra la aplicación y aparece el mensaje, en azul, de que éste ha sido clickeado.

designer4

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

Una respuesta a Widget, botón y señales en PyQGIS con QtDesigner

  1. Pingback: Newsletter Octubre 2015 | 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