PyQt QMainWindow

Resumo : neste tutorial, você aprenderá como usar o PyQt QMainWindow para criar a janela principal de um aplicativo.

Introdução ao PyQt QMainWindow

Até agora, você aprendeu como QWidgetcriar a janela principal dos aplicativos. Funciona QWidgetbem para aplicativos simples, mas não oferece suporte a recursos comuns de aplicativos de desktop completos, como barras de menu, barras de ferramentas e barras de status.

PyQt fornece QMainWindowsuporte para uma barra de menu, barras de ferramentas e barra de status prontas para uso. Então, em vez de criar uma subclasse da QWidgetclasse, você pode criar a janela principal herdando-a da QMainWindowclasse assim:

class MainWindow(QMainWindow):Linguagem de código:  Python  ( python )

PyQt divide o QMainWindowwidget em algumas seções, conforme mostrado na imagem a seguir:

Layout da janela principal Q

Observe que você não deve definir um layout para o arquivo QMainWindow. Se você fizer isso, quebrará a disposição predefinida dos widgets.

Defina o widget central

A QMainWindowpossui um e apenas um widget central. Para definir um widget como widget central, você usa o setCentralWidget()método do QMainWindowobjeto.

Por exemplo, o seguinte usa o setCentralWidget()método para definir QTextEditcomo widget central:

self.setCentralWidget(QTextEdit())Linguagem de código:  Python  ( python )

Defina o título da janela

Para definir o título da janela principal, você usa o setWindowTitle()método. Por exemplo:

self.setWindowTitle('Editor')Linguagem de código:  PHP  ( php )

Defina o ícone da janela

Para definir o ícone da janela, você usa o setWindowIcon()método. Por exemplo:

 self.setWindowIcon(QIcon('./assets/editor.png'))Linguagem de código:  PHP  ( php )

Neste exemplo:

  • Primeiro, crie um QIcone passe o caminho da imagem./assets/editor.png
  • Segundo, passe o QIconobjeto para o setWindowIcon()método para definir o ícone da janela.

Defina a geometria da janela principal

A geometria define a coordenada da janela (x,y) ou (topo, esquerda) e a largura e altura da janela:

Para definir a geometria da janela, você usa o setGeometry()método do QMainWindowobjeto. Por exemplo, o seguinte usa o setGeometry()método para definir a geometria da janela:

self.setGeometry(100, 100, 500, 300)Linguagem de código:  CSS  ( css )

Neste exemplo, a janela aparecerá em (100, 100) com largura de 500px e altura de 300px:

O programa a seguir cria a janela principal usando QMainWindow, define o widget central e o título, ícone e geometria da janela:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QToolBar, QStatusBar
from PyQt6.QtGui import QIcon, QAction


class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('Editor')
        self.setWindowIcon(QIcon('./assets/editor.png'))
        self.setGeometry(100, 100, 500, 300)

        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)

        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Adicionando uma barra de menu

Para adicionar uma barra de menu à janela principal, você usa o menuBar()método QMainWindow:

menu_bar = self.menuBar()Linguagem de código:  Python  ( python )

O menuBar()método retorna um QMenuBarobjeto. Se um QMenuBarobjeto não existir, menuBar()criará um novo QMenuBarobjeto antes de retorná-lo. Caso contrário, retorna o QMenuBarobjeto existente.

Por padrão, a barra de menu está vazia. Para adicionar um menu a uma barra de menu, você usa o addMenu()método. Por exemplo, o seguinte adiciona três submenus Arquivo, Editar e Ajuda:

file_menu = menu_bar.addMenu('&File')
edit_menu = menu_bar.addMenu('&Edit')
help_menu = menu_bar.addMenu('&Help')Linguagem de código:  Python  ( python )

O addMenu()método retorna um QMenuobjeto que representa um submenu suspenso. A string que passamos para o addMenu()método serve para rotular o menu na barra de menus.

O caractere &sublinhará o caractere do rótulo do menu quando você pressionar a ALTtecla. Por exemplo, &Fileirá sublinhar a letra F.

Ação

Para adicionar itens de menu a um menu, você precisa criar ações. Uma ação é um objeto da QActionclasse que representa a funcionalidade da aplicação.

Um objeto de ação requer um nome e um retorno de chamada para funcionar corretamente. Além disso, uma ação pode conter um ícone e um atalho de teclado.

Para criar uma ação, você pode chamar o addAction()método de a QMenu. Por exemplo, o seguinte adiciona três ações ao menu Arquivo:

file_menu.addAction('New', lambda: self.text_edit.clear())
file_menu.addAction('Open', lambda: print('Open'))
file_menu.addAction('Exit', self.destroy)Linguagem de código:  PHP  ( php )

Se você clicar no item de menu Novo, o QTextEditwidget limpará todo o conteúdo. Da mesma forma, clicando no item de menu Abrir, você verá uma mensagem no console, e clicar no menu Sair encerrará o programa.

Além disso, você pode criar um QActionobjeto e conectar seu sinal acionado a um slot. Por exemplo, o seguinte comando cria ações de desfazer e refazer e as adiciona ao menu Editar:

undo_action = QAction(QIcon('./assets/undo.png'), 'Undo', self)
undo_action.setShortcut('Ctrl+Z')
undo_action.triggered.connect(self.text_edit.undo)
edit_menu.addAction(undo_action)

redo_action = QAction(QIcon('./assets/redo.png'), 'Redo', self)
redo_action.setShortcut('Ctrl+Y')
redo_action.triggered.connect(self.text_edit.redo)
edit_menu.addAction(redo_action)Linguagem de código:  Python  ( python )

Observe que as ações de desfazer e refazer possuem ícones e atalhos de teclado.

O programa a seguir mostra como adicionar uma barra de menu e itens de menu aos menus Arquivo e Editar:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QToolBar, QStatusBar
from PyQt6.QtGui import QIcon, QAction


class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('Editor')
        self.setWindowIcon(QIcon('./assets/editor.png'))
        self.setGeometry(100, 100, 500, 300)

        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)

        # setting menu
        menu_bar = self.menuBar()

        file_menu = menu_bar.addMenu('&File')
        edit_menu = menu_bar.addMenu('&Edit')
        help_menu = menu_bar.addMenu('&Help')

        file_menu.addAction('New', lambda: self.text_edit.clear())
        file_menu.addAction('Open', lambda: print('Open'))
        file_menu.addAction('Exit', self.destroy)

        undo_action = QAction(QIcon('./assets/undo.png'), 'Undo', self)
        undo_action.setShortcut('Ctrl+Z')
        undo_action.triggered.connect(self.text_edit.undo)
        edit_menu.addAction(undo_action)

        redo_action = QAction(QIcon('./assets/redo.png'), 'Redo', self)
        redo_action.setShortcut('Ctrl+Y')
        redo_action.triggered.connect(self.text_edit.redo)
        edit_menu.addAction(redo_action)

        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Saída:

Adicionando uma barra de ferramentas

Uma barra de ferramentas é uma barra de ícones e/ou texto que expõe a função mais comumente usada do aplicativo. Para adicionar uma barra de ferramentas ao aplicativo:

  • Primeiro, crie um novo QToolBarobjeto.
  • Segundo, adicione a barra de ferramentas ao aplicativo usando o addToolbar()método do arquivo QMainWindow.

Por exemplo, o seguinte comando cria uma nova barra de ferramentas e a adiciona ao aplicativo:

toolbar = QToolBar('Main toolbar')
self.addToolBar(toolbar)Linguagem de código:  Python  ( python )

Para adicionar um item à barra de ferramentas, você usa o addAction()método do QToolBarobjeto. Por exemplo:

toolbar.addAction(undo_action)
toolbar.addAction(redo_action)Linguagem de código:  Python  ( python )

O programa a seguir mostra como adicionar uma barra de ferramentas com as ações de desfazer e refazer:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QToolBar
from PyQt6.QtGui import QIcon, QAction


class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('Editor')
        self.setWindowIcon(QIcon('./assets/editor.png'))
        self.setGeometry(100, 100, 500, 300)

        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)

        # setting menu
        menu_bar = self.menuBar()

        file_menu = menu_bar.addMenu('&File')
        edit_menu = menu_bar.addMenu('&Edit')
        help_menu = menu_bar.addMenu('&Help')

        file_menu.addAction('New', lambda: self.text_edit.clear())
        file_menu.addAction('Open', lambda: print('Open'))
        file_menu.addAction('Exit', self.destroy)

        undo_action = QAction(QIcon('./assets/undo.png'), 'Undo', self)
        undo_action.setShortcut('Ctrl+Z')
        undo_action.triggered.connect(self.text_edit.undo)
        edit_menu.addAction(undo_action)

        redo_action = QAction(QIcon('./assets/redo.png'), 'Redo', self)
        redo_action.setShortcut('Ctrl+Y')
        redo_action.triggered.connect(self.text_edit.redo)
        edit_menu.addAction(redo_action)

        # adding a toolbar
        toolbar = QToolBar('Main toolbar')
        self.addToolBar(toolbar)

        toolbar.addAction(undo_action)
        toolbar.addAction(redo_action)

        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())Linguagem de código:  Python  ( python )

Adicionando uma barra de status

Uma barra de status é uma barra localizada na parte inferior da janela principal. Normalmente, uma barra de status exibe mensagens de texto curtas e/ou widgets informativos.

Para adicionar uma barra de status ao aplicativo, você cria um QStatusBarobjeto e o configura na janela principal usando o setStatusBar()método:

status_bar = QStatusBar()
self.setStatusBar(status_bar)Linguagem de código:  Python  ( python )

O statusBar()método do QMainWindowretorna um QStatusBarobjeto. Irá criar um novo QStatusBarobjeto se a barra de status não existir.

Para exibir uma mensagem curta, você usa o showMessage()método do QStatusBarobjeto:

status_bar.showMessage('Awesome Editor v1.0')Linguagem de código:  Python  ( python )

Ou você pode usar diretamente o QStatusBarobjeto retornado pelo statusBar()método da janela principal:

self.status_bar.showMessage('Awesome Editor v1.0')Linguagem de código:  Python  ( python )

O programa a seguir mostra uma barra de status:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QToolBar, QStatusBar
from PyQt6.QtGui import QIcon, QAction


class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('Editor')
        self.setWindowIcon(QIcon('./assets/editor.png'))
        self.setGeometry(100, 100, 500, 300)

        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)

        # setting menu
        menu_bar = self.menuBar()

        file_menu = menu_bar.addMenu('&File')
        edit_menu = menu_bar.addMenu('&Edit')
        help_menu = menu_bar.addMenu('&Help')

        file_menu.addAction('New', lambda: self.text_edit.clear())
        file_menu.addAction('Open', lambda: print('Open'))
        file_menu.addAction('Exit', self.destroy)

        undo_action = QAction(QIcon('./assets/undo.png'), 'Undo', self)
        undo_action.setShortcut('Ctrl+Z')
        undo_action.triggered.connect(self.text_edit.undo)
        edit_menu.addAction(undo_action)

        redo_action = QAction(QIcon('./assets/redo.png'), 'Redo', self)
        redo_action.setShortcut('Ctrl+Y')
        redo_action.triggered.connect(self.text_edit.redo)
        edit_menu.addAction(redo_action)

        # adding a toolbar
        toolbar = QToolBar('Main toolbar')
        self.addToolBar(toolbar)

        toolbar.addAction(undo_action)
        toolbar.addAction(redo_action)

        # status bar
        self.status_bar = QStatusBar()
        self.setStatusBar(self.status_bar)
        self.status_bar.showMessage('Awesome Editor v1.0')

        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())
Linguagem de código:  Python  ( python )

Saída:

Resumo

  • Use a QMainWindowclasse para criar a janela principal do aplicativo.
  • Use o setWindowTitle()método para definir o título.
  • use o setWindowIcon()método para definir o ícone da janela.
  • Use o setGeometry()método para definir a geometria da janela, incluindo as coordenadas (superior, esquerda), largura e altura.
  • Use o menuBar()método para adicionar uma barra de menu à janela principal.
  • use o método setToolBar() para definir uma barra de ferramentas para a janela principal.
  • Use o statusBar()método para adicionar uma barra de status à janela principal.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *