Programación con PyQT4: Cuadro de diálogos modales
Algunas veces nos interesa que cuando que abramos un cuadro de dialogo o formulario para pedir datos, ese sea del tipo modal, con la intención de que hasta que no se cierre, no se pueda volver al formulario anterior (que este quede como inhabilitado: enabled). Para ello usaremos el método exec_() en vez del show().
A continuación os dejo la explicación de la documentación oficial (ver enlace) y su traducción, de como usarlo y las diferencia con el método show(), y un ejemplo.
Modal Dialogs
A modal dialog is a dialog that blocks input to other visible windows in the same application. Dialogs that are used to request a file name from the user or that are used to set application preferences are usually modal. Dialogs can beapplication modal (the default) or window modal.
When an application modal dialog is opened, the user must finish interacting with the dialog and close it before they can access any other window in the application. Window modal dialogs only block access to the window associated with the dialog, allowing the user to continue to use other windows in an application.
The most common way to display a modal dialog is to call its exec_() function. When the user closes the dialog, exec_() will provide a useful return value. Typically, to get the dialog to close and return the appropriate value, we connect a default button, e.g. OK, to the accept() slot and a Cancel button to the reject() slot. Alternatively you can call the done() slot with Accepted or Rejected.
An alternative is to call setModal(true) or setWindowModality(), then show(). Unlike exec_(), show() returns control to the caller immediately. Calling setModal(true) is especially useful for progress dialogs, where the user must have the ability to interact with the dialog, e.g. to cancel a long running operation. If you use show() and setModal(true) together to perform a long operation, you must call QApplication.processEvents() periodically during processing to enable the user to interact with the dialog. (See QProgressDialog.)
Traducido por el traductor de google:
Cuadros de diálogo modales
Un cuadro de diálogo modal es un diálogo que bloquea la entrada a otras ventanas visibles en la misma aplicación. Los diálogos que se utilizan para solicitar un nombre de archivo del usuario o que se utilizan para establecer preferencias de la aplicación suelen ser modal. Los diálogos pueden ser modal de la aplicación (por defecto) o modal ventana.
Cuando se abre un cuadro de diálogo modal aplicación, el usuario debe terminar la interacción con el diálogo y cerrarlo antes de que puedan acceder a cualquier otra ventana de la aplicación. Cuadros de diálogo modales ventana sólo bloquean el acceso a la ventana asociada con el cuadro de diálogo, que permite al usuario seguir utilizando otras ventanas en una aplicación.
La manera más común para mostrar un cuadro de diálogo modal es llamar a su función exec_(). Cuando el usuario cierra el cuadro de diálogo, exec_() proporcionará un valor de retorno útil. Normalmente, para conseguir el diálogo para cerrar y volver al valor adecuado, conectamos un botón predeterminado, por ejemplo, "OK", para la ranura (slot) accept() y un botón "Cancelar" en la ranura (slot) reject(). Alternativamente, usted puede llamar a la ranura de done() con Aceptado o Rechazado.
Una alternativa es llamar setModal (true) o setWindowModality (), y luego show(). A diferencia exec_ (), show() devuelve el control al llamador inmediato. Calling setModal (true) es especialmente útil para los diálogos de progreso, donde el usuario debe tener la capacidad de interactuar con el cuadro de diálogo, por ejemplo, para cancelar una operación de larga duración. Si utiliza show () y setModal (true) juntos para realizar una operación larga, debe llamar QApplication.processEvents () periódicamente durante el proceso para que el usuario pueda interactuar con el diálogo. (Ver QProgressDialog.)
Ejemplo:
Os dejo un simple ejemplo, en el hay 2 fomularios:
- (Ui_principal
- Ui_FormularioSegundo
Ejecutando el main.py, veremos que nos sale este formulario
Dependiendo que botón pulsemos, nos abrirá el formularioSegundo modal (exec_() ) o no (show())
Descarga del código de ejemplo: enlace
Nota:
El ejemplo esta realizado usando el ide Eric4, como proyecto.
Para abrir el ejemplo, descomprimelo en una carpeta, ve al ide de Eric4, y en el menu eliges la opción Proyecto/Abrir, ve a la carpeta donde lo descomprimiste y eliges el archivo: DialogoModales.e4p
Ref: http://pyqt.sourceforge.net/Docs/PyQt4/qdialog.html