Barra de estado, menús y menú contextual con PyQt5

Bara de estado

La barra de estado muestra mensajes informativos al usuario. Se obtiene desde QMainWindow con statusBar() y se actualiza mediante showMessage.

from PyQt5.QtWidgets import QApplication, QMainWindow

class VentanaPrincipal(QMainWindow):
    def __init__(self):
        super().__init__()
        self._configurar_ui()

    def _configurar_ui(self):
        self.statusBar().showMessage("Listo")
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle("Barra de estado")
        self.show()

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    ventana = VentanaPrincipal()
    sys.exit(app.exec_())

Barra de menú

Para agregar una barra de menús se usa menuBar(). En macOS el comportamiento nativo puede diferir, por lo que se puede forzar la presentación interna con setNativeMenuBar(False).

from PyQt5.QtWidgets import QMainWindow, QAction, qApp

class VentanaPrincipal(QMainWindow):
    def __init__(self):
        super().__init__()
        self._configurar_ui()

    def _configurar_ui(self):
        salir = QAction("&Salir", self)
        salir.setShortcut("Ctrl+Q")
        salir.setStatusTip("Cerrar la aplicación")
        salir.triggered.connect(qApp.quit)

        self.statusBar()

        barra = self.menuBar()
        # barra.setNativeMenuBar(False)  # descomentar en macOS
        menu_archivo = barra.addMenu("&Archivo")
        menu_archivo.addAction(salir)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle("Menú básico")
        self.show()

Submenús

Los submenús se crean con QMenu y se anidan dentro de otro menú usando addMenu.

from PyQt5.QtWidgets import QMainWindow, QAction, QMenu

class VentanaPrincipal(QMainWindow):
    def __init__(self):
        super().__init__()
        self._configurar_ui()

    def _configurar_ui(self):
        barra = self.menuBar()
        menu_archivo = barra.addMenu("Archivo")

        menu_importar = QMenu("Importar", self)
        accion_correo = QAction("Importar correo", self)
        menu_importar.addAction(accion_correo)

        accion_nuevo = QAction("Nuevo", self)

        menu_archivo.addAction(accion_nuevo)
        menu_archivo.addMenu(menu_importar)

        self.setGeometry(300, 300, 200, 150)
        self.setWindowTitle("Submenú")
        self.show()

Menú contextual

El menú contextual aparece al hacer clic derecho. Se implementa sborescribiendo contextMenuEvent en un QWidget.

from PyQt5.QtWidgets import QWidget, QAction, QMenu

class AreaEdicion(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self._crear_acciones()

    def _crear_acciones(self):
        self.accion_copiar = QAction("Copiar", self)
        self.accion_copiar.triggered.connect(lambda: print("Copiar"))

        self.accion_pegar = QAction("Pegar", self)
        self.accion_pegar.triggered.connect(lambda: print("Pegar"))

    def contextMenuEvent(self, evento):
        menu = QMenu(self)
        menu.addAction(self.accion_copiar)
        menu.addAction(self.accion_pegar)
        menu.exec_(evento.globalPos())

Etiquetas: PyQt5 Qt QMainWindow QAction QMenu

Publicado el 7-4 16:34