[Python-es] Re: entendiendo qtdesigner4 y pyqt4

Miguel Araujo muchochini en gmail.com
Mar Ene 1 18:17:50 CET 2008


Hola de nuevo,

He conseguido solucionar algunas de mis dudas y os las mando por si alguien
le interesa el tema. Después de cierto tiempo logré encontrar un ejemplo
para pyqt4 que me aclaró como conectar las señales con los zócalos o slots.
De momento no queda otra que escribir el código a mano, ya que parece que el
designer no incorpora la posibilidad de definir slots propios.

La línea clave para conectar una señal con un slot es:

self.connect(self.boton_continuar, QtCore.SIGNAL("clicked()"), Dialog.cerrar)

La diferencia con antes es:

self.connect(self.boton_continuar, QtCore.SIGNAL('clicked()'), Dialog ,
QtCore.SLOT('cerrar()') )

Como veis lo que hay que hacer es poner el objeto cuyo slot va a manejar la
señal. Objeto.slot  (sin comillas, ni paréntesis para el slot). Si queremos
que el objeto que lo va a manejar es el mismo que emite la señal self.slot

Ahora mi próximo problema es como crear un segundo form dinámico dependiendo
de las variables introducidas por el usuario. Ya que nunca he hecho
"interfaces dinámicas" no estoy muy seguro sobre cómo afrontar el problema.
¿algún consejo?

Muchas gracias de nuevo,

       Miguel

2007/12/26, Miguel Araujo <muchochini en gmail.com>:
>
> Hola amantes del python,
>
> Estoy trabajando en una implementación GPL en Python del algoritmo del
> Simplex para mi asignatura de Investigación Operativa. Quiero utilizar las
> librerías gráficas Qt. En su día ya usé la versión 3 para un software en
> C++. Me gustaría saber si la versión4 que estoy utilizando es estable, ya
> que KDE4 aún no ha salido, y si no estoy equivocado estas librerías gráficas
> se corresponden con este entorno, ¿cierto?
>
> Me he instalado Qtdesigner4 y he estado leyendo sobre sus principales
> diferencias con la versión3. Por si alguien le interesan, aquí se
> especifican:
> http://doc.trolltech.com/4.1/porting4-designer.html
>
> Me ha chocado mucho no poder definir mis propios slots desde qtdesigner.
> Si no puedo definirlos desde ahí, tendré que definir los slots escribiendo
> el código ¿no? ¿no hay otro método desde qtdesigner? ¿por qué lo han
> quitado? Así que siguiendo los pasos que se detallan en estos manuales:
>
> http://kib2.free.fr/pyqt4/pyqt4.html
> http://www.zetcode.com/tutorials/pyqt4/eventsandsignals/
>
> Cree de mi .uic un fichero con el código necesario, incluyendo main para
> lanzar la ventana. Luego Añadí un connect al slot close() y funcionó. El
> problema es que cuando intento añadir un slot propio deja de funcionar.
> Muestro código de la ventana de bienvenida (consiste en 2 preguntas y dos
> cajas de texto y un botón para continuar cuya función será crear la interfaz
> donde el usuario introducirá las variables):
>
> # -*- coding: utf-8 -*-
>
> # Form implementation generated from reading ui file 'simplexator.ui'
> #
> # Created: Wed Dec 26 17:12:25 2007
> #      by: PyQt4 UI code generator 4.1
> #
> # WARNING! All changes made in this file will be lost!
>
> import sys
> from PyQt4 import QtCore, QtGui
>
> class QDialogChild(QtGui.QDialog):
>     def cerrar(self,QDialog):
>         print "adios"
>         sys.exit(1)
>
> class SimplexatorWidget(QtGui.QWidget ):
>     def setupUi(self, Dialog):
>         Dialog.setObjectName("Dialog")
>         Dialog.resize(QtCore.QSize(QtCore.QRect
> (0,0,316,153).size()).expandedTo(Dialog.minimumSizeHint()))
>
>         self.label = QtGui.QLabel(Dialog)
>         self.label.setGeometry(QtCore.QRect(20,30,203,21))
>         self.label.setObjectName("label")
>
>         self.lineEdit = QtGui.QLineEdit(Dialog)
>         self.lineEdit.setGeometry (QtCore.QRect(260,30,31,27))
>         self.lineEdit.setObjectName("lineEdit")
>
>         self.lineEdit_2 = QtGui.QLineEdit(Dialog)
>         self.lineEdit_2.setGeometry(QtCore.QRect(260,70,31,27))
>         self.lineEdit_2.setObjectName("lineEdit_2")
>
>         self.label_2 = QtGui.QLabel(Dialog)
>         self.label_2.setGeometry(QtCore.QRect(20,70,228,21))
>         self.label_2.setObjectName("label_2")
>
>         self.boton_continuar = QtGui.QPushButton(Dialog)
>         self.boton_continuar.setGeometry(QtCore.QRect(210,110,80,27))
>         self.boton_continuar.setObjectName("boton_continuar")
>
>         self.retranslateUi(Dialog)
>         QtCore.QMetaObject.connectSlotsByName(Dialog)
>
>         self.connect(self.boton_continuar, QtCore.SIGNAL('clicked()'),
> Dialog , QtCore.SLOT('cerrar()') )
>
>     def retranslateUi(self, Dialog):
>         Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog",
> "Dialog", None, QtGui.QApplication.UnicodeUTF8))
>         self.label.setText(QtGui.QApplication.translate ("Dialog",
> "¿Cuántas variables tiene tu PPL?", None, QtGui.QApplication.UnicodeUTF8))
>         self.label_2.setText(QtGui.QApplication.translate("Dialog",
> "¿Cuántas restricciones tiene tu PPL?", None,
> QtGui.QApplication.UnicodeUTF8))
>         self.boton_continuar.setText(QtGui.QApplication.translate("Dialog",
> "Continuar", None, QtGui.QApplication.UnicodeUTF8))
>
> if __name__ == "__main__":
>     app = QtGui.QApplication(sys.argv)
>     Dialog = QDialogChild()
>     ui = SimplexatorWidget()
>     ui.setupUi(Dialog)
>     Dialog.show()
>     sys.exit(app.exec_())
>
> El error que muestra es: Object::connect: No such slot QDialog::cerrar()
>
> No sé porque no funciona si he creado una clase hija con herencia simple
> que define la función callable cerrar.
>
> Gracias de antemano por cualquier ayuda, documentación al respecto o
> comentario.
>
> Un saludo
>
>               Miguel
>


Más información sobre la lista de distribución Python-es