В этом уроке вы узнаете, как использовать класс 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)
