Python PyQt

PyQt es una potente biblioteca de Python para crear interfaces gráficas de usuario (GUI), que puede usarse como alternativa al Tkinter integrado de Python.

PyQt es la vinculación de Python al framework Qt, ampliamente utilizado en el desarrollo de aplicaciones de escritorio.

Qt es un framework de desarrollo de aplicaciones C++ multiplataforma.

PyQt permite a los desarrolladores de Python utilizar la biblioteca Qt para crear potentes aplicaciones GUI.

PyQt tiene las siguientes versiones principales:

  • PyQt4: vinculación basada en Qt4
  • PyQt5: vinculación basada en Qt5
  • PyQt6: vinculación basada en Qt6 (última versión)

Instalar PyQt

Instalar PyQt5 con pip:

# 安装PyQt5
pip install PyQt5

# 安装Qt设计师和其他工具(可选)
pip install PyQt5-tools

Primer programa PyQt

Crear una ventana simple

El siguiente es un programa PyQt básico que crea una ventana en blanco:

Ejemplo

from PyQt5.QtWidgets import QApplication, QWidget

# Crear la instancia de la aplicación
app = QApplication([])

# Crear la ventana principal
window = QWidget()
window.setWindowTitle("Mi primer programa PyQt")
window.setGeometry(100, 100, 400, 300)  # (x, y, width, height)

# Mostrar la ventana
window.show()

# Ejecutar la aplicación
app.exec_()

Análisis del código

  1. QApplicationGestiona el flujo de control y la configuración principal de las aplicaciones GUI.
  2. QWidgetLa clase de ventana más básica; todos los componentes de la interfaz de usuario heredan de ella.
  3. setWindowTitle()Establece el título de la ventana.
  4. setGeometry()Establece la posición y el tamaño de la ventana.
  5. show()Muestra la ventana.
  6. app.exec_()Inicia el bucle de eventos y espera la interacción del usuario.

Una aplicación PyQt típica consta de las siguientes partes:

  1. Objeto QApplicationCada aplicación PyQt necesita tener una instancia de QApplication.
  2. Ventanas y controlesComponentes de la interfaz de usuario
  3. Bucle de eventosBucle que procesa la entrada del usuario y los eventos del sistema
  4. Manejadores de eventosFunciones o métodos que responden a eventos

Ejemplo

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
       
        # Establecer el título y el tamaño de la ventana
        self.setWindowTitle("Mi primera aplicación PyQt")
        self.setGeometry(100, 100, 400, 300)  # x, y, width, height
       
        # Crear un botón
        self.button = QPushButton("Haz clic", self)
        self.button.setGeometry(150, 150, 100, 30)
        self.button.clicked.connect(self.button_clicked)
       
    def button_clicked(self):
        print("¡Se hizo clic en el botón!")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())


Componentes comunes de PyQt

Botón (QPushButton)

Ejemplo

from PyQt5.QtWidgets import QPushButton

button = QPushButton("Haz clic", window)
button.move(150, 150)  # Establecer la posición del botón

Etiqueta (QLabel)

Ejemplo

from PyQt5.QtWidgets import QLabel

label = QLabel("Hello PyQt!", window)
label.move(100, 100)

Campo de texto (QLineEdit)

Ejemplo

from PyQt5.QtWidgets import QLineEdit

textbox = QLineEdit(window)
textbox.move(100, 50)

Para más contenido sobre componentes comunes, consulta:https://www.example.com/python3/python-pyqt-widgets.html


Gestión de diseño (QVBoxLayout)

Usar gestores de diseño permite ajustar automáticamente la posición de los componentes:

Ejemplo

from PyQt5.QtWidgets import QVBoxLayout, QLabel, QPushButton

layout = QVBoxLayout()
layout.addWidget(QLabel("Nombre de usuario"))
layout.addWidget(QLineEdit())
layout.addWidget(QPushButton("Iniciar sesión"))
window.setLayout(layout)

Para más contenido sobre gestión de diseños, consulta:https://www.example.com/python3/python-pyqt-layout.html


Mecanismo de señales y ranuras

PyQt usaseñal (Signal)yranura (Slot)el mecanismo para manejar eventos.

El mecanismo de señales y ranuras de PyQt es el mecanismo central para la comunicación entre objetos.

  • Señal (Signal): notificación emitida cuando ocurre un evento específico.
  • Ranura (Slot): función o método que responde a la señal.

Ejemplo

from PyQt5.QtWidgets import QPushButton

def on_button_click():
    print("¡Se hizo clic en el botón!")

button = QPushButton("Haz clic", window)
button.clicked.connect(on_button_click)  # Conectar señal y ranura

Señal personalizada

Ejemplo

from PyQt5.QtCore import pyqtSignal, QObject

class MyEmitter(QObject):
    my_signal = pyqtSignal(str)  # Definir una señal

emitter = MyEmitter()
emitter.my_signal.connect(lambda x: print(f"Señal recibida: {x}"))
emitter.my_signal.emit("Hello")  # Emitir la señal

Para más contenido sobre gestión de diseños, consulta:https://www.example.com/python3/python-pyqt-signals-and-slots.html


Usar Qt Designer

Qt Designer es una herramienta de diseño visual que permite diseñar interfaces arrastrando y soltando componentes:

  • Iniciar Designer (normalmente en el directorio Lib\site-packages\qt5_applications\Qt\bin de la instalación de Python)
  • Diseña la interfaz y guárdala como.uiarchivo
  • va a.uiConvierta el archivo a código Python:

    pyuic5 input.ui -o output.py

Usar la interfaz generada en el código:

Ejemplo

from PyQt5 import uic

# Cargar el archivo UI
Form, Window = uic.loadUiType("output.ui")

# Usar la UI
app = QApplication(sys.argv)
window = Window()
form = Form()
form.setupUi(window)
window.show()
sys.exit(app.exec_())

Práctica: una aplicación simple de bloc de notas

Diseño de interfaz

Ejemplo

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit,
                            QAction, QFileDialog, QMessageBox)

class Notepad(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
       
    def initUI(self):
        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)
       
        self.create_actions()
        self.create_menus()
       
        self.setWindowTitle('Bloc de notas simple')
        self.setGeometry(100, 100, 800, 600)
       
    def create_actions(self):
        # Acciones del menú Archivo
        self.new_action = QAction('Nuevo', self)
        self.new_action.setShortcut('Ctrl+N')
        self.new_action.triggered.connect(self.new_file)
       
        self.open_action = QAction('Abrir', self)
        self.open_action.setShortcut('Ctrl+O')
        self.open_action.triggered.connect(self.open_file)
       
        self.save_action = QAction('Guardar', self)
        self.save_action.setShortcut('Ctrl+S')
        self.save_action.triggered.connect(self.save_file)
       
        self.exit_action = QAction('Salir', self)
        self.exit_action.setShortcut('Ctrl+Q')
        self.exit_action.triggered.connect(self.close)
       
        # Acciones del menú Edición
        self.copy_action = QAction('Copiar', self)
        self.copy_action.setShortcut('Ctrl+C')
        self.copy_action.triggered.connect(self.text_edit.copy)
       
        self.paste_action = QAction('Pegar', self)
        self.paste_action.setShortcut('Ctrl+V')
        self.paste_action.triggered.connect(self.text_edit.paste)
       
        self.cut_action = QAction('Cortar', self)
        self.cut_action.setShortcut('Ctrl+X')
        self.cut_action.triggered.connect(self.text_edit.cut)
       
    def create_menus(self):
        menubar = self.menuBar()
       
        # Menú Archivo
        file_menu = menubar.addMenu('Archivo')
        file_menu.addAction(self.new_action)
        file_menu.addAction(self.open_action)
        file_menu.addAction(self.save_action)
        file_menu.addSeparator()
        file_menu.addAction(self.exit_action)
       
        # Menú Edición
        edit_menu = menubar.addMenu('Edición')
        edit_menu.addAction(self.copy_action)
        edit_menu.addAction(self.paste_action)
        edit_menu.addAction(self.cut_action)
       
    def new_file(self):
        self.text_edit.clear()
       
    def open_file(self):
        filename, _ = QFileDialog.getOpenFileName(self, 'Abrir archivo')
        if filename:
            try:
                with open(filename, 'r') as f:
                    self.text_edit.setText(f.read())
            except Exception as e:
                QMessageBox.warning(self, 'Error', f'No se puede abrir el archivo: {e}')
               
    def save_file(self):
        filename, _ = QFileDialog.getSaveFileName(self, 'Guardar archivo')
        if filename:
            try:
                with open(filename, 'w') as f:
                    f.write(self.text_edit.toPlainText())
            except Exception as e:
                QMessageBox.warning(self, 'Error', f'No se puede guardar el archivo: {e}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    notepad = Notepad()
    notepad.show()
    sys.exit(app.exec_())


Componentes centrales de PyQt5

La mayoría de los componentes se encuentran en PyQt5.QtWidgets.

Las funciones avanzadas (como multimedia, red) pueden requerir otros módulos (por ejemplo, QtCore, QtGui, QtNetwork, etc.).

QListView/QTableView/QTreeView deben usarse con modelos de datos (como QStandardItemModel), lo que ofrece mayor flexibilidad.

Otras extensiones que se pueden instalar:

pip install PyQtWebEngine  # 网页支持
pip install PyQtChart      # 图表支持
Categoría de componenteNombre del componenteMóduloDescripción
Componentes básicos de ventanaQWidgetQtWidgetsClase base de todos los objetos de interfaz de usuario; puede usarse como ventana en blanco o contenedor.
QMainWindowQtWidgetsMarco de ventana principal; incluye barra de menús, barra de herramientas, barra de estado, etc.
QDialogQtWidgetsClase base de diálogo, utilizada para ventanas emergentes.
Gestión de diseñoQVBoxLayoutQtWidgetsGestor de diseño vertical
QHBoxLayoutQtWidgetsGestor de diseño horizontal
QGridLayoutQtWidgetsGestor de diseño de cuadrícula
QFormLayoutQtWidgetsGestor de diseño de formulario (pares de etiqueta + campo de entrada)
BotonesQPushButtonQtWidgetsBotón normal
QRadioButtonQtWidgetsBotón de opción
QCheckBoxQtWidgetsCasilla de verificación
QToolButtonQtWidgetsBotón de barra de herramientas (puede incluir icono)
Controles de entradaQLineEditQtWidgetsCampo de entrada de texto de una línea
QTextEditQtWidgetsEditor de texto enriquecido de varias líneas (compatible con HTML)
QPlainTextEditQtWidgetsEditor de texto plano de varias líneas
QSpinBoxQtWidgetsCuadro de ajuste numérico (entero)
QDoubleSpinBoxQtWidgetsCuadro de ajuste numérico (coma flotante)
QComboBoxQtWidgetsCuadro de selección desplegable
QDateEditQtWidgetsSelector de fecha
QTimeEditQtWidgetsSelector de hora
QDateTimeEditQtWidgetsSelector de fecha y hora
QSliderQtWidgetsBarra deslizante (horizontal/vertical)
QDialQtWidgetsControl de perilla circular
Controles de visualizaciónQLabelQtWidgetsEtiqueta de texto/imagen
QLCDNumberQtWidgetsPantalla de dígitos LCD
QProgressBarQtWidgetsBarra de progreso
QStatusBarQtWidgetsBarra de estado (normalmente se usa paraQMainWindow)
ContenedoresQGroupBoxQtWidgetsCuadro de grupo (contenedor con título)
QTabWidgetQtWidgetsContenedor de pestañas
QStackedWidgetQtWidgetsContenedor apilado (muestra un control hijo a la vez)
QScrollAreaQtWidgetsContenedor de área de desplazamiento
QMdiAreaQtWidgetsÁrea MDI (interfaz de múltiples documentos)
Lista/Tabla/ÁrbolQListWidgetQtWidgetsControl de lista (con gestión de elementos)
QTreeWidgetQtWidgetsControl de árbol
QTableWidgetQtWidgetsControl de tabla
QListViewQtWidgetsVista de lista (requiere un modelo de datos)
QTableViewQtWidgetsVista de tabla (requiere un modelo de datos)
QTreeViewQtWidgetsVista de árbol (requiere un modelo de datos)
Menú / Barra de herramientasQMenuBarQtWidgetsBarra de menús
QMenuQtWidgetsMenú (puede contener submenús y acciones)
QToolBarQtWidgetsBarra de herramientas
QActionQtWidgetsAcción (para elementos de menú, botones de barra de herramientas, etc.)
Cuadro de diálogoQFileDialogQtWidgetsCuadro de diálogo de selección de archivos
QColorDialogQtWidgetsCuadro de diálogo de selección de color
QFontDialogQtWidgetsCuadro de diálogo de selección de fuente
QInputDialogQtWidgetsCuadro de diálogo de entrada (texto, números, etc.)
QMessageBoxQtWidgetsCuadro de mensaje (advertencia, error, pregunta, etc.)
Vista gráficaQGraphicsViewQtWidgetsMarco de vista gráfica (para gráficos 2D)
QGraphicsSceneQtWidgetsEscena gráfica (para usar en combinaciónQGraphicsViewcon)
Otros componentes funcionalesQCalendarWidgetQtWidgetsControl de calendario
QSplashScreenQtWidgetsPantalla de inicio
QSystemTrayIconQtWidgetsIcono de bandeja del sistema
QWebEngineViewQtWebEngineWidgetsComponente de navegador web (debe instalarse por separadoPyQtWebEngine)

Recursos de aprendizaje

Otras extensiones