PyQt QStatusBar

Resumo: neste tutorial, você aprenderá como usar a QStatusBarclasse PyQt para criar widgets de barra de status.

Introdução à classe PyQt QStatusBar

A QStatusBarclasse 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 QMainWindowobjeto 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_barvariável, poderá usá-la posteriormente em outros métodos da classe.

Ou você pode chamar diretamente o self.statusBar()método para obter o QStatusBarobjeto e chamar seu método.

Para mostrar uma mensagem na barra de status, você usa o showMessage()método do QStatusBarobjeto.

showMessage(text,timeout=0)Linguagem de código:  Python  ( python )

Por padrão, a showMessage()mensagem exibirá o texto até que você chame o método clearMessage()ou showMessage()novamente.

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 QStatusBarobjeto se o widget não for filho do QStatusBarobjeto.

Localiza QStatusBaro widget permanente na extremidade direita da barra de status.

Exemplo PyQt QStatusBar

Continuaremos o programa editor de texto do QToolBartutorial. Faremos o seguinte com a barra de status:

  • Mostre uma Readymensagem 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 QLabelwidget exibe o número de caracteres do QTextEditwidget. Por padrão, mostra zero caracteres.

Depois disso, conecte o textChangedsinal ao self.text_changedslot 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_changedmé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 QStatusBarclasse 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()ou addPermanentWidget()para adicionar um widget à barra de status.

Deixe um comentário

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