User Tools

Site Tools


python:qt

Qt - Librería gráfica

QT SDK (Librerias Qt + Designer SDK)
http://get.qtsoftware.com/qtsdk/qt-sdk-win-opensource-2009.03.exe
PyQt (Librerias de Qt para Python) (A la hora de instalar, especificar la ruta exacta del directorio python dentro de django)
http://www.riverbankcomputing.co.uk/static/Downloads/PyQt4/PyQt-Py2.6-gpl-4.5.1-1.exe

En QT, para mantener espaciado y que funcione con el redimensionado de la ventana, crearé Layouts, pero para mayor libertad de posicionamiento de los elementos, dentro de los mismos introduciremos Muelles (Spacers)

Código base

Primero de todo creamos con Qt Designer un formulario Main Window que sera la ventana principal del programa.

Guardamos el archivo, que tendrá extensión .ui. Mediante la utilidad pyuic.py (normalmente se encuentra en C:\Python26\Lib\site-packages\PyQt4\uic\pyuic.py) ejecutamos lo siguiente para convertirlo a extensión .py:

python pyuic.py main_window.ui -o main_window.py

Podemos usar el siguiente main.py para lanzar la interfaz que acabamos de crear:

import sys
from PyQt4 import QtGui
#Importamos el archivo con el codigo del formulario principal
import main_window_code
 
app = QtGui.QApplication(sys.argv)
#Creamos una ventana
window = QtGui.QMainWindow()
#Creamos el objeto de la clase del formulario, de la forma Ui_<nombre>
ui = main_window_code.Ui_MainWindow_Code()
ui.setupUi(window)
 
#Se inicia el bucle de ejecucion principal de QT
window.show()
sys.exit(app.exec_())

Si queremos añadir signals y código, podemos hacerlo en el mismo fichero main_window.py, pero si cambiamos alguna cosa de la interfaz y volvemos a ejecutar pyuic.py, se machacarán los cambios que hubieramos hecho. Para evitar que suceda esto podemos crear un fichero nuevo, main_window_code.py que contendrá todo lo que queramos añadir al fichero principal. La estructura es la siguiente:

from PyQt4 import QtCore, QtGui
#Importamos el fichero que contiene el codigo generado por pyuic.py
import main_window
 
#Esta clase tiene como primer parametro el nombre del fichero y la clase principal generada por pyuic.py
class Ui_MainWindow_Code(main_window.Ui_MainWindow):
	def setupUi(self,MainWindow):
		#Llamamos a la superclase
		main_window.Ui_MainWindow.setupUi(self,MainWindow)
 
		#Todas las signals y personalizaciones de la interfaz las ponemos a continuacion para que no se machaquen
		QtCore.QObject.connect(self.buttonEjemplo,QtCore.SIGNAL("clicked()"),self.funcion_ejemplo)
 
	#Todas las funciones de la clase las ponemos a continuacion
	def funcion_ejemplo(self):
		QtGui.QMessageBox("Ejemplo","Mensaje de ejemplo",QtGui.QMessageBox.Information,1,0,0).exec_()

Overload sobre funciones de clases instanciadas

Si tenemos una clase que ya ha sido instanciada y que contiene funciones, podemos sobreescribir las llamadas a esas funciones para que ejecuten otra función distinta:

self.claseInstanciada.__class__.funcionAntigua = self.funcionNueva

Drag and drop

Tenemos que sobreescribir tres funciones para tener en cuenta el drag & drop:

self.myWidget.__class__.dragEnterEvent = self.myDrag
self.myWidget.__class__.dragMoveEvent = self.myMove
self.myWidget.__class__.dropEvent = self.myDrop
 
def myDrag(self, event):
	event.accept()
	event.ignore()
python/qt.txt · Last modified: 2009/08/18 15:04 by josep