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
criar a janela principal dos aplicativos. Funciona QWidget
bem 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.QWidget
PyQt fornece
suporte para uma barra de menu, barras de ferramentas e barra de status prontas para uso. Então, em vez de criar uma subclasse da QMainWindow
QWidget
classe, você pode criar a janela principal herdando-a da
classe assim:QMainWindow
class MainWindow(QMainWindow):
Linguagem de código: Python ( python )
PyQt divide o QMainWindow
widget em algumas seções, conforme mostrado na imagem a seguir:
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
possui um e apenas um widget central. Para definir um widget como widget central, você usa o QMainWindow
setCentralWidget()
método do
objeto.QMainWindow
Por exemplo, o seguinte usa o setCentralWidget()
método para definir QTextEdit
como 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
QIcon
e passe o caminho da imagem./assets/editor.png
- Segundo, passe o
QIcon
objeto para osetWindowIcon()
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 QMainWindow
objeto. 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
método retorna um menuBar()
objeto. Se um QMenuBar
objeto não existir, QMenuBar
criará um novo menuBar()
objeto antes de retorná-lo. Caso contrário, retorna o QMenuBar
objeto existente.QMenuBar
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
método retorna um addMenu()
QMenu
objeto que representa um submenu suspenso. A string que passamos para o
método serve para rotular o menu na barra de menus.addMenu()
O caractere &
sublinhará o caractere do rótulo do menu quando você pressionar a ALT
tecla. Por exemplo, &File
irá 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 QAction
classe 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 QTextEdit
widget 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 QAction
objeto 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
QToolBar
objeto. - Segundo, adicione a barra de ferramentas ao aplicativo usando o
addToolbar()
método do arquivoQMainWindow
.
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 QToolBar
objeto. 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 QStatusBar
objeto 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 QMainWindow
retorna um
objeto. Irá criar um novo QStatusBar
objeto se a barra de status não existir.QStatusBar
Para exibir uma mensagem curta, você usa o showMessage()
método do QStatusBar
objeto:
status_bar.showMessage('Awesome Editor v1.0')
Linguagem de código: Python ( python )
Ou você pode usar diretamente o QStatusBar
objeto 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
QMainWindow
classe 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.