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)