PyQt5 Tutorial - Barra de Menu

  1. PyQt5 Exemplo Básico da Barra de Menu
  2. Ícones do Item do Menu PyQt5 Menubar
  3. PyQt5 Menubar Item de menu verificável

Uma barra de menu está normalmente no canto superior esquerdo da GUI e sob a barra de título. Se o usuário clicar no item do menu, ele pode tomar ações como abrir arquivos, salvar arquivos ou sair da aplicação.

Vamos aprender como iniciar uma barra de menu, ligar a acção ao menu, adicionar os atalhos e mostrar o texto de estado.

PyQt5 Exemplo Básico da Barra de Menu

Vamos criar o nosso primeiro exemplo de menubar PyQt5 que tem o menu File como na maioria dos editores. Incluímos apenas o sub-menu 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_())

PyQt5 Menubar Basic

menubar = self.menuBar()

A QMainWindow tem o método menuBar() para criar a barra de menu.

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

O fileMenu é adicionado à barra de menu com o nome File, e consiste em uma entrada de menu que associa o objeto QAction - exitAction.

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

Ele cria o objeto QAction para sair da aplicação e salva este objeto na variável exitAction.

Este objeto QAction tem o nome de &Exit e está associado ao atalho CTRL+Q.

exitAction.setStatusTip('Exit application')

Ele mostra a mensagem extra na barra de status self.statusBar quando o usuário passa o ponteiro do mouse sobre esta entrada de menu.

exitAction.triggered.connect(qApp.quit)

Nós conectamos o evento que esta ação de saída é acionada no slot de saída da aplicação.

Ícones do Item do Menu PyQt5 Menubar

Temos dois métodos para definir o ícone do item de menu na barra de menu do PyQt5.

Pixmap padrão no estilo padrão do PyQt5

Podemos definir o ícone do item de menu com os ícones padrão usando o pixmap padrão no estilo padrão.

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

O código acima seleciona o ícone padrão de cancelamento de diálogo.

PyQt5 Menubar Pixmap Ícone 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_())

Utilize arquivo de imagem com QIcon

Além do método acima para utilizar os ícones padrão do QStyle, também poderíamos utilizar qualquer arquivo de imagem como ícone utilizando a classe QIcon.

QIcon('exit.png')

Ele define o arquivo de imagem exit.png para ser o ícone. O arquivo exit.png deve estar na mesma pasta que o arquivo de script python.

Ícone QIcone PyQt5 Menubar

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_())

PyQt5 Menubar Item de menu verificável

O item de menu verificável pode ser verificado ou desmarcado e o estado é alternado cada vez que o usuário clicar nele.

Precisamos definir o argumento da palavra-chave Checkable para ser True para tornar o item de menu verificável quando criamos o 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_())

PyQt5 Menubar Item verificável

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

A propriedade checkable deve ser definida como True para tornar o item do menu verificável quando iniciamos o objeto QAction.

Ou podemos utilizar o método setCheckable() depois que o objeto for criado.

self.setCheckable(True)
Nota

O estado do item verificável é o parâmetro para a função de retorno de chamada. Portanto, devemos listá-lo no argumento ao definir a função. Como em

def toggleLabel(self, state):

O state é do tipo booleano, com o valor de True quando selecionado e False quando não selecionado.