This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
python:qt [2009/07/30 18:45] nejo created |
python:qt [2009/08/18 22:04] (current) josep overload |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Qt - Librería gráfica ====== | ====== Qt - Librería gráfica ====== | ||
- | QT SDK (Librerias Qt + Designer SDK) | + | QT SDK (Librerias Qt + Designer SDK)\\ |
- | PyQt (Librerias de Qt para Python) (A la hora de instalar, especificar la ruta exacta del directorio python dentro de django) | + | 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)\\ | |
- | 1. Creamos con Qt Creator el formulario | + | http://www.riverbankcomputing.co.uk/static/Downloads/PyQt4/PyQt-Py2.6-gpl-4.5.1-1.exe |
- | 2. pyuic4 <nombre.ui> -o <nombre.py> | + | |
- | 3. Modificamos el .py que ejecuta la clase poniendo el from del archivo correcto y el nombre de la clase nueva | + | |
- | 4. Ejecutamos el que llama a todo .py | + | |
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) | 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**: | ||
+ | <code> | ||
+ | python pyuic.py main_window.ui -o main_window.py | ||
+ | </code> | ||
+ | |||
+ | Podemos usar el siguiente **main.py** para lanzar la interfaz que acabamos de crear: | ||
+ | <code python> | ||
+ | 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_()) | ||
+ | </code> | ||
+ | |||
+ | 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: | ||
+ | <code python> | ||
+ | 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_() | ||
+ | |||
+ | </code> | ||
+ | |||
+ | ===== 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: | ||
+ | <code python> | ||
+ | self.claseInstanciada.__class__.funcionAntigua = self.funcionNueva | ||
+ | </code> | ||
+ | |||
+ | ===== Drag and drop ===== | ||
+ | Tenemos que sobreescribir tres funciones para tener en cuenta el drag & drop: | ||
+ | <code python> | ||
+ | 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() | ||
+ | </code> | ||
+ |