Crea ventanas, widgets y layouts con PyQt6. Conecta señales y slots, separa UI de lógica, y maneja múltiples ventanas.
Se definen con pyqtSignal(tipo) como atributo de clase (fuera de __init__), no como atributo de instancia. Se emiten con self.mi_senal.emit(dato).
from PyQt6.QtCore import pyqtSignalfrom PyQt6.QtWidgets import QWidget, QLineEdit class CampoTexto(QWidget): # Atributo de CLASE — compartido entre instancias, requerido por PyQt senal_nuevo_texto = pyqtSignal(str) def __init__(self): super().__init__() campo = QLineEdit() campo.returnPressed.connect(self.al_enviar) self.campo = campo def al_enviar(self): texto = self.campo.text() self.senal_nuevo_texto.emit(texto) # emite la señal con el datoPara capturar eventos de bajo nivel se sobreescriben métodos del widget:
mousePressEvent(event) → click del mouse; event.pos() da la posiciónmouseMoveEvent(event) → movimiento; requiere self.setMouseTracking(True) para dispararse sin clickkeyPressEvent(event) → tecla presionada; event.key() retorna el código de la teclaLa forma más limpia de manejar múltiples ventanas es conectar sus señales en el __main__. Las ventanas no se conocen entre sí — solo emiten señales.
from PyQt6.QtCore import pyqtSignalfrom PyQt6.QtWidgets import QWidget, QPushButton, QVBoxLayout class VentanaPrincipal(QWidget): senal_abrir_segunda = pyqtSignal() def __init__(self): super().__init__() self.setWindowTitle('Principal') boton = QPushButton('Abrir segunda ventana') boton.clicked.connect(self.senal_abrir_segunda.emit) layout = QVBoxLayout() layout.addWidget(boton) self.setLayout(layout) class VentanaSecundaria(QWidget): def __init__(self): super().__init__() self.setWindowTitle('Segunda') if __name__ == '__main__': app = QApplication(sys.argv) v1 = VentanaPrincipal() v2 = VentanaSecundaria() # instanciada en main → no se destruye v1.senal_abrir_segunda.connect(v2.show) # sin paréntesis en show v1.show() sys.exit(app.exec())Instancia todas las ventanas en el main antes de iniciar el event loop. Así el scope del main las mantiene vivas durante toda la ejecución y puedes conectar sus señales libremente.