domingo, mayo 13, 2007

Conectando eventos en PyQt

Ahora que conocemos los rudimentos de PyQt, es hora de hacer algo cuando el usuario interactúa con la GUI.
Para esto usaremos el connect (método de QObject).
Veamos el siguiente ejemplo, (ha sido lo más simple que se me ha ocurrido
Como verán esta vez no lo hice desde la consola sino desde el editor de texto (de donde saqué los colores bonitos).

#! /usr/bin/python
'''
Un ejemplo de conexion de eventos en PyQt4
'''

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
class Ventana(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
# Redimencionar la ventana
self.resize(QSize(QRect(0,0,400,110).size())) #.expandedTo(Form.minimumSizeHint()))
boton = QPushButton("Pulsame", self)
# Agrandar el boton
boton.setGeometry(QRect(100,20,80,27))
QWidget.connect(boton, SIGNAL("clicked()"), self.un_metodo )
# ahora lo conectamos con otro
def un_metodo(self):
print "hola"

# algo que quizas se podría llamar main()
def principal():
app = QApplication(sys.argv)
v = Ventana()
v.show()
app.exec_()

# lo que se ejecuta cuando llamamos al script
if __name__ == "__main__":
principal()

A esta altura comenzarán a chocarse, si es que ya no lo han hecho con no conocer los métodos de las clases de Qt, a veces dir(), type() y el método __doc__ de los objetos no es suficiente y requerimos algo más solido.
Para esto está QtAssistant (o simplemente assistant, o assistant-qt4) desde la consola. Es "la ayuda" que sale cuando pulsamos F1 sobre un widget en el diseñador.
Para finalizar los invito a volver a la consola y ver que interesante idea de modularidad tiene python (digamos que el script de más arriba se llama eje.py).


[nahuel@valhalla Documents]$ python
Python 2.4.4 (#2, Jan 13 2007, 17:50:26)
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import eje
>>> eje.principal()
>>>

Espero que ya le estén agarrando el gustito! Les advierto que es muy adictivo!

2 comentarios:

Pedro dijo...

interesantisimo el articulo... estoy empezando con esto del python... el formulario lo tengo hecho con QT y ahora solo me faltar darle funcionalidades a los botones... a ver si con tu ejemplo me aclaro un poco...
muchisimas gracias!

luben dijo...

Interesantes los artículos que has ido publicando sobre PyQT (enhorabuena)

Respecto al uso de eventos (signals y slots) con una interfaz definida con QT (tal y como comenta Pedro) ¿es posible hacerlo?

Hasta ahora sólo he encontrado a gente que compila con pyuic el formulario creado en QT y luego hace las conexiones pero no haciendo uso de loaduic

Se agradecería un ejemplo que funcione (idealmente que al pulsar el botón aparezca algo en la terminal como print "Hola" ;) )

Un saludo