Resumo: neste tutorial, você aprenderá como usar a QStatusBar
classe PyQt para criar widgets de barra de status.
Introdução à classe PyQt QStatusBar
A QStatusBar
classe permite criar um widget de barra de status. O widget da barra de status é útil para apresentar informações de status.
Normalmente, você usará o statusBar()
método do QMainWindow
objeto para criar uma barra de status para a janela principal:
self.status_bar = self.statusBar()
Linguagem de código: Python ( python )
O statusBar()
método retorna a barra de status da janela principal. Se a barra de status não existir, a função cria e retorna uma barra de status vazia.
Portanto, se você atribuir a barra de status à self.status_bar
variável, poderá usá-la posteriormente em outros métodos da classe.
Ou você pode chamar diretamente o
método para obter o self.statusBar
()QStatusBar
objeto e chamar seu método.
Para mostrar uma mensagem na barra de status, você usa o showMessage()
método do QStatusBar
objeto.
showMessage(text,timeout=0)
Linguagem de código: Python ( python )
Por padrão, a
mensagem exibirá o texto até que você chame o método showMessage()
clearMessage()
ou
novamente.showMessage()
O tempo limite especifica o número de milissegundos que a mensagem será exibida. O tempo limite é zero, o que exibe o texto permanentemente.
Cada status no status possui uma das seguintes categorias:
- Temporário – ocupa brevemente a maior parte da barra de status. Por exemplo, status que explicam textos de dicas de ferramentas ou entradas de menu.
- Normal – ocupa apenas parte da barra de status. Por exemplo, o status para exibir a página e o número da linha.
- Permanente – é sempre mostrado. Por exemplo, uma mensagem que mostra o status do indicador Caps Lock.
Além de mostrar uma mensagem, você pode adicionar um widget à barra de status usando o addWidget()
método:
addWidget(widget[, stretch=0])
Linguagem de código: Python ( python )
Para ocultar um widget na barra de status, você usa o removeWidget()
método. Depois de ocultar um widget, você pode exibi-lo novamente usando o addWidget()
método.
A barra de status localiza o widget adicionado pelo addWidget()
método na extremidade esquerda. Se você chamar o showMessage()
método, a mensagem ocultará o widget.
Para adicionar um widget permanente à barra de status, você usa addPermanentWidget()
o método:
addPermanentWidget(widget[, stretch=0])
Linguagem de código: Python ( python )
O método adiciona o widget à barra de status e altera o pai do widget para o
objeto se o widget não for filho do QStatusBar
objeto.QStatusBar
Localiza QStatusBar
o widget permanente na extremidade direita da barra de status.
Exemplo PyQt QStatusBar
Continuaremos o programa editor de texto do QToolBar
tutorial. Faremos o seguinte com a barra de status:
- Mostre uma
Ready
mensagem que será exibida em 5 segundos quando o programa for iniciado. - Adicione um widget permanente que exiba o número de caracteres na barra de status.
- Mostrar uma mensagem quando o arquivo for salvo.
Aqui está o programa completo:
import sys
from pathlib import Path
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QFileDialog, QMessageBox, QToolBar, QLabel
from PyQt6.QtGui import QIcon, QAction
from PyQt6.QtCore import QSize
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowIcon(QIcon('./assets/editor.png'))
self.setGeometry(100, 100, 500, 300)
self.title = 'Editor'
self.filters = 'Text Files (*.txt)'
self.set_title()
self.path = None
self.text_edit = QTextEdit(self)
self.text_edit.textChanged.connect(self.text_changed)
self.setCentralWidget(self.text_edit)
menu_bar = self.menuBar()
file_menu = menu_bar.addMenu('&File')
edit_menu = menu_bar.addMenu('&Edit')
help_menu = menu_bar.addMenu('&Help')
# new menu item
new_action = QAction(QIcon('./assets/new.png'), '&New', self)
new_action.setStatusTip('Create a new document')
new_action.setShortcut('Ctrl+N')
new_action.triggered.connect(self.new_document)
file_menu.addAction(new_action)
# open menu item
open_action = QAction(QIcon('./assets/open.png'), '&Open...', self)
open_action.triggered.connect(self.open_document)
open_action.setStatusTip('Open a document')
open_action.setShortcut('Ctrl+O')
file_menu.addAction(open_action)
# save menu item
save_action = QAction(QIcon('./assets/save.png'), '&Save', self)
save_action.setStatusTip('Save the document')
save_action.setShortcut('Ctrl+S')
save_action.triggered.connect(self.save_document)
file_menu.addAction(save_action)
file_menu.addSeparator()
# exit menu item
exit_action = QAction(QIcon('./assets/exit.png'), '&Exit', self)
exit_action.setStatusTip('Exit')
exit_action.setShortcut('Alt+F4')
exit_action.triggered.connect(self.quit)
file_menu.addAction(exit_action)
# edit menu
undo_action = QAction(QIcon('./assets/undo.png'), '&Undo', self)
undo_action.setStatusTip('Undo')
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.setStatusTip('Redo')
redo_action.setShortcut('Ctrl+Y')
redo_action.triggered.connect(self.text_edit.redo)
edit_menu.addAction(redo_action)
about_action = QAction(QIcon('./assets/about.png'), 'About', self)
help_menu.addAction(about_action)
about_action.setStatusTip('About')
about_action.setShortcut('F1')
# toolbar
toolbar = QToolBar('Main ToolBar')
self.addToolBar(toolbar)
toolbar.setIconSize(QSize(16, 16))
toolbar.addAction(new_action)
toolbar.addAction(save_action)
toolbar.addAction(open_action)
toolbar.addSeparator()
toolbar.addAction(undo_action)
toolbar.addAction(redo_action)
toolbar.addSeparator()
toolbar.addAction(exit_action)
# status bar
self.status_bar = self.statusBar()
# display the a message in 5 seconds
self.status_bar.showMessage('Ready', 5000)
# add a permanent widget to the status bar
self.character_count = QLabel("Length: 0")
self.status_bar.addPermanentWidget(self.character_count)
self.show()
def set_title(self, filename=None):
title = f"{filename if filename else 'Untitled'} - {self.title}"
self.setWindowTitle(title)
def confirm_save(self):
if not self.text_edit.document().isModified():
return True
message = f"Do you want to save changes to {self.path if self.path else 'Untitled'}?"
MsgBoxBtn = QMessageBox.StandardButton
MsgBoxBtn = MsgBoxBtn.Save | MsgBoxBtn.Discard | MsgBoxBtn.Cancel
button = QMessageBox.question(
self, self.title, message, buttons=MsgBoxBtn
)
if button == MsgBoxBtn.Cancel:
return False
if button == MsgBoxBtn.Save:
self.save_document()
return True
def new_document(self):
if self.confirm_save():
self.text_edit.clear()
self.set_title()
def write_file(self):
self.path.write_text(self.text_edit.toPlainText())
self.statusBar().showMessage('The file has been saved...', 3000)
def save_document(self):
# save the currently openned file
if (self.path):
return self.write_file()
# save a new file
filename, _ = QFileDialog.getSaveFileName(
self, 'Save File', filter=self.filters
)
if not filename:
return
self.path = Path(filename)
self.write_file()
self.set_title(filename)
def open_document(self):
filename, _ = QFileDialog.getOpenFileName(self, filter=self.filters)
if filename:
self.path = Path(filename)
self.text_edit.setText(self.path.read_text())
self.set_title(filename)
def quit(self):
if self.confirm_save():
self.destroy()
def text_changed(self):
text = self.text_edit.toPlainText()
self.character_count.setText(f'Length: {len(text)}')
if __name__ == '__main__':
try:
# show the app icon on the taskbar
import ctypes
myappid = 'yourcompany.yourproduct.subproduct.version'
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
finally:
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec())
Linguagem de código: Python ( python )
Como funciona. (Vamos nos concentrar na parte da barra de status)
Primeiro, chame o statusBar()
método para criar a barra de status da janela principal:
self.status_bar = self.statusBar()
Linguagem de código: Python ( python )
A seguir, mostre a mensagem ‘Pronto’ em cinco segundos usando o showMessage()
método:
self.status_bar.showMessage('Ready', 5000)
Linguagem de código: Python ( python )
Em seguida, adicione um widget permanente à barra de status usando o addPermanentWidget()
método:
self.character_count = QLabel("Length: 0")
self.status_bar.addPermanentWidget(self.character_count)
Linguagem de código: Python ( python )
O QLabel
widget exibe o número de caracteres do QTextEdit
widget. Por padrão, mostra zero caracteres.
Depois disso, conecte o textChanged
sinal ao self.text_changed
slot para atualizar a contagem de caracteres:
self.text_edit.textChanged.connect(self.text_changed)
Linguagem de código: Python ( python )
e você precisa definir o text_changed
método:
def text_changed(self):
text = self.text_edit.toPlainText()
self.character_count.setText(f'Length: {len(text)}')
Linguagem de código: Python ( python )
Por fim, defina o write_file()
método que salva o texto em um arquivo e exibe uma mensagem indicando que o arquivo foi salvo por três segundos:
def write_file(self):
self.path.write_text(self.text_edit.toPlainText())
self.statusBar().showMessage('The file has been saved...', 3000)
Linguagem de código: Python ( python )
O write_file()
método é chamado sempre que o arquivo é salvo.
Resumo
- Qt usa
QStatusBar
classe para criar um widget de barra de status. - Use o
statusBar()
método para obter uma barra de status da janela principal. - Use
showMessage()
para exibir uma mensagem na barra de status. - Use o método
addWidget()
ouaddPermanentWidget()
para adicionar um widget à barra de status.