2012-01-05 24 views
8

Estoy tratando de conectar la señal de clic() de un botón a mi propia función. El botón está en un widget que creé con QT Designer. Me carga el archivo .ui con QUiLoader así:Cómo implementar una señal/ranura definida en Qt Designer

class MyWidget(QtGui.QMainWindow): 
    def __init__(self, *args): 
     QtGui.QMainWindow.__init__(self, *args) 

     loader = QtUiTools.QUiLoader() 
     file = QtCore.QFile("pyside_ui_qtdesigner_form_test.ui") 
     file.open(QtCore.QFile.ReadOnly) 
     self.myWidget = loader.load(file, self) 
     file.close() 

     self.setCentralWidget(self.myWidget) 

     btn = self.myWidget.findChild(QtGui.QPushButton, "HelloWorldButton") 
     btn.clicked.connect(self.slot1)   

    def slot1(self): 
     print "Received" 

¿Es esta la forma correcta de conectar a un botón de señal() hecho clic? Veo que puedo conectar señales y ranuras directamente en Qt Designer, pero ¿cómo me preparo y obtengo tales conexiones en el código? Pregunta lateral: El código anterior funciona, pero la ventana principal muestra el tamaño incorrecto. ¿Cómo me aseguro de que aparezca con el tamaño correcto? ¿Debo hacer esto con las restricciones mínimas de altura/ancho?

Respuesta

12

Utilice Signals and Slots Editing Mode para conectar señales Qt predefinidas directamente a las ranuras Qt predefinidas.

Así que para el botón "Cerrar" en un diálogo sencillo, sólo puede arrastrar una conexión desde el botón de la ventana de diálogo, seleccione la señal clicked() y la ranura reject(), haga clic en "Aceptar", y no habría nada más que hacer .

Para señales y/o ranuras que quiera definir usted mismo, no necesita "preparar" nada en el Diseñador de antemano. Todo debe hacerse en tu propio código.

Su ejemplo demuestra ya esta bastante bien, pero la conexión se podría hacer mucho más limpia y sencilla, así:

self.myWidget.HelloWorldButton.clicked.connect(self.slot1) 

En cuanto a la ventana principal que tiene el "tamaño incorrecto": es difícil decir del código que ha mostrado, pero puede deberse a que no configuró un diseño en el widget que está cargando.

BTW: ¿Hay alguna razón específica por la que esté usando QUiLoader? La compilación de módulos de Python con pyuic4 es mucho más flexible, y puede aprender mucho del código que se genera.

EDITAR

Para mí, el establecimiento de un diseño en el formulario principal cura el problema de cambio de tamaño que está hablando.

Si no sabe cómo hacerlo: en Designer, haga clic derecho en una parte en blanco del formulario principal, y luego seleccione Layout/Layout in a Grid en el menú (también hay un botón en la barra de herramientas para esto).

Una vez que haya hecho eso, el cambio de tamaño del formulario lo estirará automáticamente para que se ajuste a los widgets que contiene.

+0

¡Gracias funciona bien! Repasar problemas de tamaño, establecer tamaños mínimos en Qt Designer ayudó. Pensé que tal vez haya una forma programática de garantizar que la ventana principal tenga el tamaño adecuado para que todos los widgets que están dentro sean visibles. – Sven

+0

Re QUiLoader, sin motivo específico, aparte de eso, es simple. Para el enfoque 'pyuic4', tendré que investigar cómo hacer que Eclipse/PyDev inicie' pyuic4' automáticamente para archivos .ui. – Sven

+0

@Sven. Vea mi respuesta actualizada sobre el cambio de tamaño: estoy bastante seguro de que es un problema de diseño. – ekhumoro

Cuestiones relacionadas