TUTORIAL · PyQt5

PyQt5 Tutorial - Barra de Menu

Este tutorial introduz o widget PyQt5 Menubar. Ele cobre os tópicos de atalhos de menubar, ação e gatilhos.

Nesta página

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.

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.