miércoles, 24 de junio de 2015

3 - Python PyQt (Interfaz gráfica) - Eventos MainWindow (Show, Close, Move, ...)




En este capítulo del tutorial de Python 3 con PyQt5 veremos como manejar eventos en un objeto MainWindow. Un evento se puede definir como un determinado suceso que ocurre durante la ejecución del programa, este suceso puede ser capturado y realizar una determinada acción o acciones según la necesidad del programador.

La lista de eventos disponibles en PyQt la podéis ver en el siguiente enlace: http://pyqt.sourceforge.net/Docs/PyQt4/qevent.html

Para el ejemplo nos basaremos en la misma ventana (MainWindow) de los dos capítulos anteriores (Capítulo 1 y Capítulo 2), el objetivo es capturar los eventos Show (Cuando la ventana se muestra), Close (Cuando la ventana se cierra) y Move (Cuando la ventana se mueve) y realizar una determinada acción para cada uno de los eventos anteriormente mencionados.

MainWindow.pyw


import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
from PyQt5 import uic
from PyQt5.QtGui import QFont
from PyQt5.QtCore import Qt
import ctypes #GetSystemMetrics

#Clase heredada de QMainWindow (Constructor de ventanas)
class Ventana(QMainWindow):
 #Método constructor de la clase
 def __init__(self):
  #Iniciar el objeto QMainWindow
  QMainWindow.__init__(self)
  #Cargar la configuración del archivo .ui en el objeto
  uic.loadUi("MainWindow.ui", self)
  self.setWindowTitle("Cambiando el título de la ventana")
  #Mostrar la ventana maximizada
  self.showMaximized()
  #Fijar el tamaño de la ventana
  #Fijar el tamaño mínimo
  self.setMinimumSize(500, 500)
  #Fijar el tamaño máximo
  self.setMaximumSize(500, 500)
  #Mover la ventana y centrarla en el escritorio
  resolucion = ctypes.windll.user32
  resolucion_ancho = resolucion.GetSystemMetrics(0)
  resolucion_alto = resolucion.GetSystemMetrics(1)
  left = (resolucion_ancho / 2) - (self.frameSize().width() / 2)
  top = (resolucion_alto / 2) - (self.frameSize().height() / 2)
  self.move(left, top)
  #Desactivar la ventana
  #self.setEnabled(False)
  #Asignar un tipo de fuente
  qfont = QFont("Arial", 12, QFont.Bold)
  self.setFont(qfont)
  #Asignar un tipo de cursor
  self.setCursor(Qt.SizeAllCursor)
  #Asignar estilos CSS
  #self.setStyleSheet("background-color: #000; color: #fff;")
  #Modificar estilos de uno de los elementos de la ventana
  self.boton.setStyleSheet("background-color: #000; color: #fff; font-size: 14px;")
  
 #Evento para cuando la ventana se muestra
 def showEvent(self, event):
  self.bienvenido.setText("¡¡¡Bienvenido!!!")
  
 #Evento para cuando la ventana se cierra
 def closeEvent(self, event):
  resultado = QMessageBox.question(self, "Salir ...", "¿Seguro que quieres salir de la aplicación?", QMessageBox.Yes | QMessageBox.No)
  if resultado == QMessageBox.Yes: event.accept()
  else: event.ignore()
  
 #Evento para cuando la ventana se mueve
 def moveEvent(self, event):
  x = str(event.pos().x())
  y = str(event.pos().y())
  self.posicion.setText("x: " + x + " y: " + y)
  
#Instancia para iniciar una aplicación
app = QApplication(sys.argv)
#Crear un objeto de la clase
_ventana = Ventana()
#Mostra la ventana
_ventana.show()
#Ejecutar la aplicación
app.exec_()