PyQt QToolBar

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

Introdução à classe PyQt QToolBar

Uma barra de ferramentas é um painel móvel que contém um conjunto de controles. Para criar uma barra de ferramentas, você usa a QToolBarclasse:

O seguinte cria uma nova barra de ferramentas usando a QToolBarclasse e a adiciona à janela principal usando o addToolBar()método do QMainWindowObject:

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

O setIconSize()método do QToolBarobjeto permite definir o tamanho dos ícones que aparecem na barra de ferramentas.

Por exemplo, você pode definir o tamanho dos ícones para (16,16). Para fazer isso, você passa um QSizeobjeto para o setIconSize()método assim:

toolbar.setIconSize(QSize(16, 16))Linguagem de código:  Python  ( python )

Normalmente, você adiciona botões à barra de ferramentas usando o addAction()método:

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

Para separar grupos de botões na barra de ferramentas, você usa o addSeparator()método:

toolbar.addSeparator()Linguagem de código:  Python  ( python )

Além dos botões, você pode adicionar widgets à barra de ferramentas usando o addWidget()método.

Uma barra de ferramentas pode ser movida entre as áreas da barra de ferramentas da janela principal por padrão. Para fixar a barra de ferramentas em uma área específica, você passa False para o setMovable()método do QToolBarobjeto.

Para definir uma área para a barra de ferramentas, você pode usar o setAllowedArea()método. As áreas permitidas são superior, inferior, esquerda e direita.

Usando a classe PyQt QToolBar para criar uma barra de ferramentas

Continuaremos o programa editor de texto do QMenututorial criando um widget na barra de ferramentas:

A seguir mostra o programa completo:

import sys
from pathlib import Path
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QFileDialog, QMessageBox, QToolBar
from PyQt6.QtGui import QIcon, QAction
from PyQt6.QtCore import QSize, Qt


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.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()
        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 save_document(self):
        # save the currently openned file
        if (self.path):
            return self.path.write_text(self.text_edit.toPlainText())

        # save a new file
        filename, _ = QFileDialog.getSaveFileName(
            self, 'Save File', filter=self.filters
        )

        if not filename:
            return

        self.path = Path(filename)
        self.path.write_text(self.text_edit.toPlainText())
        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()


if __name__ == '__main__':
    try:
        import ctypes
        myappid = 'mycompany.myproduct.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 ferramentas)

Primeiro, crie um novo objeto de barra de ferramentas usando a QToolBarclasse e adicione-o à janela principal usando o addToolBar()método.

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

Em seguida, defina o tamanho dos ícones na barra de ferramentas para (16,16):

toolbar.setIconSize(QSize(16, 16))Linguagem de código:  Python  ( python )

Em seguida, adicione ações novas, salvas e abertas à barra de ferramentas. Além disso, adicione um separador usando o addSeparator()método:

toolbar.addAction(new_action)
toolbar.addAction(save_action)
toolbar.addAction(open_action)
toolbar.addSeparator()Linguagem de código:  Python  ( python )

Depois disso, adicione ações de desfazer e refazer à barra de ferramentas e outro separador:

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

Finalmente, adicione a ação de saída:

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

Resumo

  • Use a QToolBarclasse para criar uma nova barra de ferramentas.
  • Use o addToolBar()método para adicionar uma barra de ferramentas à janela principal.
  • Use o addAction()método para adicionar um item à barra de ferramentas.
  • Use o addSeparator()método para adicionar um separador aos botões.

Deixe um comentário

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