PyQt QToolBar в Python — виджет панели инструментов

В этом уроке вы узнаете, как использовать класс PyQt QToolBar для создания виджетов панели инструментов в Python.

Что такое класс PyQt QToolBar

Панель инструментов — это подвижная панель, которая содержит набор элементов управления. Для создания панели инструментов используется класс QToolBar.

Следующий код создает новую панель инструментов с использованием класса QToolBar и добавляет ее в главное окно с помощью метода addToolBar() объекта QMainWindowObject:

toolbar = QToolBar('Main ToolBar')
self.addToolBar(toolbar)

Метод setIconSize() объекта QToolBar позволяет установить размер значков, отображаемых на панели инструментов.

Например, вы можете установить размер иконок(16,16). Для этого вы передаете объект QSize в метод setIconSize() следующим образом:

toolbar.setIconSize(QSize(16, 16))

Обычно кнопки на панель инструментов добавляются с помощью метода addAction():

toolbar.addAction(my_action)

Для разделения групп кнопок на панели инструментов используйте метод addSeparator():

toolbar.addSeparator()

Помимо кнопок, на панель инструментов можно добавлять виджеты с помощью метода addWidget().

Панель инструментов может быть перемещаемой между областями панелей инструментов главного окна по умолчанию. Чтобы зафиксировать панель инструментов в определенной области, вы передаете False методу setMovable() объекта QToolBar.

Чтобы задать область для панели инструментов, можно использовать метод setAllowedArea(). Разрешенные области: верхняя, нижняя, левая и правая.

Использование класса PyQt QToolBar для создания панели инструментов

Продолжим программу текстового редактора из руководства QMenu, создав виджет панели инструментов:

Пример создания виджета панели инструментов

Ниже представлена полная программа:

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())

Как это работает (мы сосредоточимся на части панели инструментов).

Сначала создайте новый объект панели инструментов с помощью класса QToolBar и добавьте его в главное окно с помощью метода addToolBar().

toolbar = QToolBar('Main ToolBar')
self.addToolBar(toolbar)

Далее установите размер значков на панели инструментов(16,16):

toolbar.setIconSize(QSize(16, 16))

Затем добавьте на панель инструментов действия new, save и open. Также добавьте разделитель с помощью метода addSeparator():

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)
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *