Acerca de Pyqt4

Pyqt tiene por proposito crear aplicaciones con GUI(Grafic User Interface), es decir, programas que corren ventanas donde la GUI es el frontend, "la ventana", y python ejecuta las tareas pedidas via interface gráfica, es decir, python corre por detras. Qt es una de las librerias más poderosas en la actualidad. El sitio oficial de PyQt es www.riverbankcomputing.co.uk. Aunque los ejemplos que contiene están en codigo C visitarle puede servir para darse una referencia de lo que puede hacer en python ya que las instrucciones son las mismas, por ejemplo "QWidget ()". Aqui emplearemos la versión 4 que tiene diferencias con las anteriores versiones. Aunque es posible programar con pyqt4 en forma imperativa, es raro que alguien lo haga. Se usa más bien programación orientada a objetos. Las clases disponibles están divididas en 7 modulos:

  • QtCore
  • QtQtNetwork Gui
  • QtXml
  • QtSvg
  • QtOpenGL
  • QtSql

El modulo QtCore contiene el corazon de funcionalidades no-gráficas. Se usa para trabajar con tiempos, archivos y directorios, tipos de datos variables, streams, urls, tipos mime, threads(hilos) o procesos.

El modulo QtGui contiene componentes gráficos y sus respectivas clases, por ejemplo incluye botones, ventanas, barra de estado, barra de herramientas, sliders, bitmaps, colores, fuentes, etc.

El modulo QtNetwork contiene clases utiles para programas relacionados con la red, haciendo que programar sea facil y otorgandole portabilidad.

El modulo QtXml como su nombre lo dice contiene clases para trabajar conarchivos xml .

El modulo QtSvg contiene clases para desplegar el contenido de archivos SVG(Scalable Vector Graphics), graficos vectoriales escalables.

El modulo QtOPenGL es uado para renderizar 3-D y 2-D gráficos usando librerias OpenGL. El módulo permite la integración de la interfaz gráfica de usuario Qt libary y la librería OpenGL.

El modulo QtSql contiene clases para trabajar con bases de datos.

Ahora vamos a aprender funcionalidades básicas a traves de ejemplos y alguna explicación.

La primera ventana

El primer ejemplo es el de una ventana simple, vacia. Se la puede redimensionar, minimizar, maximizar, aqui va:

	        #!/usr/bin/python 
		# ventana.py 
		import sys 
		from PyQt4 import QtGui 
		app = QtGui.QApplication(sys.argv) 
		widget = QtGui.QWidget() 
		widget.resize(250, 150) 
		widget.setWindowTitle("simple") 
		widget.show() 
		sys.exit(app.exec_())

La clase QtGui.QApplication(sys.argv) se llama como es usual app = QtGui.QApplication(sys.argv). Sirve para crear una aplicación objeto. Las aplicaciónes objeto está localizadas en el módulo QtGui. El parámetro sys.argv es una lista de los argumentos de la línea de comandos. Los scripts de Python se puede ejecutar desde el shell y esta es la manera cómo podemos controlar la puesta en marcha de nuestros scripts.

La clase QtGui.QWidget () se llama usando widget = QtGui.QWidget (). Sirve para proporcionar cualquier objeto de interfaz de usuario en PyQt4. Aquí se proporciona el constructor predeterminado QWidget. El constructor por defecto no tiene una clase padre.

El método widget.resize redimensiona el ancho y alto de la ventana widget. Tiene 250px de ancho y 150px de alto, px pixeles. Con widget.setWindowTitle("simple") ponemos el título "simple" a la ventana. El título se muestra en la barra de título. El método widget.show () muestra nuestra ventana widget en la pantalla. Por último sys.exit (app.exec_()), entra como el lazo principal de la aplicación, maneja los eventos. El lazo principal recibe los eventos del sistema de la ventana y despacha a los controles de aplicación. El lazo principal termina, si llamamos al método exit () o el widget principal es cerrado. El método sys.exit () asegura una limpieza de salida. El ambiente será informado sobre cómo terminó la aplicación. ¿Por qué exec_() lleva guión?, exec es una palabra reservada de Python si no llevará guión el programa no correria, porque su uso es diferente a lo normal para exec.

Ventana con Icono

Para el segundo ejemplo usamos clases, indica como agregar un icono cualquiera a nuestra ventana. El icono de una aplicación es una imagen pequeña, que normalmente se muestra en la parte superior izquierda de la barra de título.

     #!/usr/bin/python 
	# ventana_icon.py 
	import sys 
	from PyQt4 import QtGui 
	class Icon(QtGui.QWidget): 
		def__init__(self, parent=None): 
		     QtGui.QWidget.__init__(self, parent) 
		     self.setGeometry(300, 300, 250, 150) 
		     self.setWindowTitle("Icon ") 
		     self.setWindowIcon(QtGui.QIcon("
	/usr/share/icons/.../emblem-default.png")) 
	app = QtGui.QApplication(sys.argv) 
	icon = Icon() 
	icon.show() 
	sys.exit(app.exec_())

Es similar al ejemplo anterior a expeción de usamos clases. Notamos la herencia que hace la clase padre QtGui.QWidget, a la clase hija Icon, que hereda el constructor de QtGui.QWidget. Las tres clases del constructor se han heredado de QtGui.QWidget. La instrucción setGeometry () hace dos cosas situa la ventana en la posición que le demos con los primeros 2 de 4 parametros, y los parametros 3 y 4 corresponden a la anchura y altura de las dimensiones de la ventana. Luego la instrucción setWindowTitle () pone el titulo de la ventana y setWindowIcon(QtGui.QIcon("/usr/share/icons/gnome/8x8/emblems/emblem-default.png ") pone el icono de acuerdo a la ruta del archivo dado en el esquina superior izquierda de la ventana.

Un texto de ayuda

En el tercer ejemplo encontramos un texto de ayuda que se puede incluir en cualquier widget. Si quisiera agregarle solo tendria que agregar al script anterior las lineas:

 
from PyQt4 import QtCore

self.setToolTip("Este es un QWidget widget ")
QtGui.QToolTip.setFont(QtGui.QFont("OldEnglish ", 10))          

Desplegará un cuadro de tonalidad amarilla con el texto "Este es un QWidget widget ".

Un boton salir

En el siguiente ejemplo se muestra una manera no obvia de cerrar una ventana, es decir, no usando la x del extremo superior derecho. Para hacerlo se debe aprender señales y slots y poner botones. La llamada y la instrucción para poner un boton es "quit = QtGui.QPushButton("Close ", self)". Para hacerlo agrege al codigo anterior lo siguiente en el cuerpo de la clase:

quit = QtGui.QPushButton("Close", self) 
quit.setGeometry(10, 10, 60, 35) 
self.connect(quit, QtCore.SIGNAL("clicked()") 
QtGui.qApp, QtCore.SLOT("quit()")) 

El sistema de procesamiento de eventos en PyQt4 se construye con los mecanismos de señales y la slots. Si hacemos clic en el botón, la señal clicked () es emitida. El slot puede ser un slot PyQt o cualquier python llamable. El método QtCore.QObject.connect () conecta señales con slots. En nuestro caso, el slot es uno predefinido PyQt quit () slot. La comunicación se realiza entre estos dos objetos. El emisor y el receptor. El emisor el botón y el receptor es la aplicación objeto. A continuación la salida para mensaje y boton expuestos antes.

Ventana con mensaje

Ahora crearemos una ventana con un mensaje, a partir del siguiente codigo y aplicando lo ya visto:

def closeEvent(self, event): 
	reply = QtGui.QMessageBox.question(self, "Message", 
"Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: event.accept() else: event.ignore() self.connect(quit, QtCore.SIGNAL("clicked()"),
QtGui.qApp,QtCore.SLOT("quit()"))

Si cerramos la Qwidget, generamos QCloseEvent. Para modificar el comportamiento del widget tenemos que volver a implementar la closeEvent (), lo hacemos con “reply = QtGui.QMessageBox.question(self, "Message", "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)”. Mostrará un cuadro de mensaje con dos botones. Sí y No. La primera cadena "Message"aparece en la barra de título. La segunda cadena es el texto del mensaje que muestra el cuadro de diálogo. El valor de retorno se almacena en la variable de reply. El condicional pone a prueba el valor de retorno. Si hace clic en el botón Sí, aceptamos el evento lo que conduce a la clausura del widget y para la terminación del aplicación. De lo contrario, ignorar el evento de cierre y “QtCore.SIGNAL(. . . )” conecta la señal con el slot.

Barra de estado

Lo siguiente seria crear barras de estado, de menu, y de herramientas. Para programar la ventana principal se usa la clase QMainWindow proporciona una ventana de la aplicación principal. La barra de estado es un widget que se usa para desplegar información de estado. Recapitulando el codigo para añadir esta nueva funcionalidad a los trozos de codigo expuestos en un solo codigo es, a excepción del box de mensaje:

 #!/usr/bin/python 
 # ventana.py 
 import sys 
 from PyQt4 import QtGui, QtCore 
 class MainWindow(QtGui.QMainWindow, QtGui.QWidget): 
   def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     QtGui.QWidget.__init__(self, parent=None) 
     self.resize(250, 150) 
     self.setWindowTitle("statusbar") 
     self.statusBar().showMessage("Ready") 
     self.setGeometry(300, 300, 250, 150) 
     self.setWindowTitle("Icon") 
     self.setWindowIcon(QtGui.QIcon("
/usr/share/icons/.../emblem-default.png")) self.setToolTip("Este es un QWidgetwidget") QtGui.QToolTip.setFont(QtGui.QFont("
OldEnglish", 10)) quit = QtGui.QPushButton("Close", self) quit.setGeometry(10, 10, 60, 35) self.connect(quit, QtCore.SIGNAL("clicked()"),
QtGui.qApp, QtCore.SLOT("quit()")) app = QtGui.QApplication(sys.argv) main = MainWindow() main.show() sys.exit(app.exec_())

Solo hay dos cambios para hacer con respecto a las instrucciones anteriores, primero usamos herencia multiple con la sentencia “class MainWindow(QtGui.QMainWindow, QtGui.QWidget):”, y segundo incluir “self.statusBar().showMessage("Ready")” que es la instrucción para insertar una barra de estado con el texto "Ready"en nuestra ventana gráfica, con la siguiente salida:

Barra de menu

Para insertar una barra de menu, hay que añadir al codigo lo siguiente:

menubar = self.menuBar() 
file = menubar.addMenu("&File") 
file.addAction(exit) 

Claro, para que este menu tenga sentido se le debe dar una acción al menos, esta es 'exit' o salida que para ser operativa se debe añadir el siguiente codigo:

exit = QtGui.QAction("Exit", self) 
exit.setShortcut("Ctrl+Q") 
exit.setStatusTip("Exit application") 
self.connect(exit, QtCore.SIGNAL("triggered()"), QtCore.SLOT("close()")) 

Primero creamos una barra de menú con el método de menuBar () de la clase QMainWindow. A continuación, se añade un menú con el método addMenu (). Al final, conectamos una acción objeto en el menú de archivo “&File”, el simbolo & se usa para que la señal File sea posible accederla vía shortcut, tecla corta o atajo con “Ctrl+Q”. En fin, las acciones son todo un campo dentro de la programación con PyQt4, las acciones constituyen la ejecucución de una sentencia de codigo del programa como por ejemplo abrir un archivo o cerrarlo como el mostrado. La Clase QAction provee una acción abstracta de interfaz de usuario que puede ser insertada en los Widgets. El codigo completo tiene la siguiente salida:

Barra de herramientas

Los menus agrupan todos los comandos que podemos usar en un programa. La barra de herramientas provee un acceso rapido para los comandos usados más frecuentemente. Para insertar una barra de herramientas solo ingrese el siguiente codigo:

 toolbar = self.addToolBar("Exit") 
 toolbar.addAction(exit) 

Con el codigo completo con barras de status, menu, y herramientas, queda:

Free Web Hosting