Tutorial de PyQt5 - MenuBar

  1. Ejemplo básico de Menubar PyQt5
  2. Iconos de la entrada de menú de PyQt5
  3. Elemento de menú verificable PyQt5 Menubar

Normalmente hay una barra de menú en la esquina superior izquierda de la interfaz gráfica y bajo la barra de título. Si el usuario hace clic en el elemento del menú, puede tomar acciones como abrir archivos, guardar archivos o salir de la aplicación.

Aprenderemos cómo iniciar una barra de menú, vincular la acción al menú, añadir los accesos directos y mostrar el texto de estado.

Ejemplo básico de Menubar PyQt5

Crearemos nuestro primer ejemplo de menú PyQt5 que tiene un menú File como en la mayoría de los editores. Sólo incluimos el sub-menú Exit para simplificar.

PyQt5 Menubar_Basic.py
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication

class basicMenubar(QMainWindow):
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)        
        
        self.initUI()        
        
    def initUI(self):    
        
        self.setGeometry(200, 200, 200, 200)           
        
        exitAction = QAction('&Exit', self)        
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(qApp.quit)

        self.statusBar()

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)
        
        
        self.setWindowTitle('PyQt5 Basic Menubar')    
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = basicMenubar()
    sys.exit(app.exec_())

Menús básicos de PyQt5

menubar = self.menuBar()

QMainWindow tiene el método menuBar() para crear la barra de menú.

fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)

Se añade fileMenu a la barra de menús con el nombre File, y consiste en una entrada de menú que se asocia con el objeto QAction - exitAction.

exitAction = QAction('&Exit', self)        
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
exitAction.triggered.connect(qApp.quit)

Crea el objeto QAction para salir de la aplicación y guarda este objeto en la variable exitAction.

Este objeto QAction tiene el nombre de &Exit y está asociado al atajo Ctrl + Q.

exitAction.setStatusTip('Exit application')

Muestra el mensaje extra en la barra de estado self.statusBar cuando el usuario pasa el puntero del ratón sobre esta entrada del menú.

exitAction.triggered.connect(qApp.quit)

Conectamos el evento que esta acción de salida se dispara al slot de salida de la aplicación.

Iconos de la entrada de menú de PyQt5

Tenemos dos métodos para establecer el icono del elemento de menú en la barra de menú de PyQt5.

Mapa de píxeles estándar en el estilo por defecto de PyQt5

Podríamos establecer el icono de la opción de menú con los iconos estándar utilizando el pixmap estándar en el estilo por defecto.

self.style().standardIcon(QStyle.SP_DialogCancelButton)

El código anterior selecciona el icono estándar de la cancelación de diálogos.

Icono del Pixmap de Menubar PyQt5 QStyle

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication, QStyle


class basicMenubar(QMainWindow):
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs) 
        
        self.initUI()        
        
    def initUI(self):    
        
        self.setGeometry(200, 200, 200, 200)           
        
        exitAction = QAction(self.style().standardIcon(QStyle.SP_DialogCancelButton),
                             '&Exit', self)        
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(qApp.quit)

        self.statusBar()

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)
        
        
        self.setWindowTitle('PyQt5 Basic Menubar')    
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = basicMenubar()
    sys.exit(app.exec_())

Usar el archivo de imagen con QIcon

Además del método anterior de utilizar los iconos por defecto de QStyle, también podríamos utilizar cualquier archivo de imagen como icono utilizando la clase QIcon.

QIcon('exit.png')

Establece el archivo de imagen exit.png como el icono. El archivo exit.png debe estar en la misma carpeta que el archivo de script python.

Icono QIcon del Menubar PyQt5

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication, QStyle
from PyQt5.QtGui import QIcon


class basicMenubar(QMainWindow):
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)        
        
        self.initUI()        
        
    def initUI(self):    
        
        self.setGeometry(200, 200, 200, 200)           
        
        exitAction = QAction(QIcon('exit.png'),
                             '&Exit', self)        
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(qApp.quit)

        self.statusBar()

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)
        
        
        self.setWindowTitle('PyQt5 Basic Menubar')    
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = basicMenubar()
    sys.exit(app.exec_())

Elemento de menú verificable PyQt5 Menubar

El elemento de menú seleccionable puede ser marcado o desmarcado y el estado se conmuta cada vez que el usuario hace clic en él.

Necesitamos establecer el argumento de palabra clave checkable como True para hacer que el elemento del menú sea comprobable cuando creamos el objeto QAction.

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication, QLabel
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt


class basicMenubar(QMainWindow):
    
    def __init__(self):
        super().__init__()        
        
        self.initUI()        
        
    def initUI(self):    
        
        self.setGeometry(200, 200, 200, 200)  
        
        self.label = QLabel("The toggle state is ")
        self.label.setAlignment(Qt.AlignCenter)
        
        self.setCentralWidget(self.label)
        
        toggleAction = QAction('&Toggle Label', self, checkable=True)        
        toggleAction.setStatusTip('Toggle the label')
        toggleAction.triggered.connect(self.toggleLabel)
        
        exitAction = QAction(QIcon('exit.png'),
                             '&Exit', self)        
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(qApp.quit)

        self.statusBar()

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(toggleAction)
        fileMenu.addAction(exitAction)
        
        
        
        self.setWindowTitle('PyQt5 Basic Menubar')    
        self.show()
        
    def toggleLabel(self, state):
        self.label.setText("The toggle state is {}".format(state))
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = basicMenubar()
    sys.exit(app.exec_())

Elemento comprobable del menú PyQt5

toggleAction = QAction('&Toggle Label', self, checkable=True)  

La propiedad checkable debe establecerse como True para que el elemento del menú sea comprobable cuando iniciemos el objeto QAction.

O podríamos usar el método setCheckable() después de que el objeto sea creado.

self.setCheckable(True)
Nota

El estado del elemento comprobable es el parámetro de la función de devolución de llamada. Por lo tanto, debemos listarlo en el argumento al definir la función. Como

def toggleLabel(self, state):

El state es de tipo booleano, con el valor True cuando está seleccionado y False cuando no está seleccionado.

comments powered by Disqus