Создание главного окна с помощью PyQt QMainWindow в Python
Ранее вы узнали, как использовать QWidget для создания главного окна приложений. QWidget отлично работает для простых приложений, но не поддерживает общие функции полноценных настольных приложений, такие как строки меню, панели инструментов и строки состояния.
- Знакомство с PyQt QMainWindow
- Установка central widget
- Установка заголовка окна
- Иконка окна
- Как установить геометрию для главного окна
- Добавление строки меню
- Действие
- Добавление панели инструментов
- Добавление строки состояния
Знакомство с PyQt QMainWindow
PyQt предоставляет вам QMainWindow, который поддерживает панель меню, панели инструментов и строку состояния из коробки. Поэтому вместо создания подкласса класса QWidget вы можете создать главное окно в Python, унаследовав его от класса QMainWindow следующим образом:
class MainWindow(QMainWindow):
PyQt делит виджет QMainWindow на несколько разделов, как показано на следующем рисунке:
Обратите внимание, что вам не следует устанавливать макет для QMainWindow. Если вы это сделаете, вы нарушите предустановленное расположение виджетов.
Установка central widget
QMainWindow имеет один и только один центральный виджет. Чтобы установить его, используйте метод setCentralWidget() объекта QMainWindow.
Например, ниже используется метод setCentralWidget() для установки QTextEdit в качестве центрального виджета:
self.setCentralWidget(QTextEdit())
Установка заголовка окна
Чтобы задать заголовок главного окна, используйте метод setWindowTitle(). Например:
self.setWindowTitle('Editor')
Иконка окна
Чтобы установить иконку для окна, используйте метод setWindowIcon(). Например:
self.setWindowIcon(QIcon('./assets/editor.png'))
В этом примере:
- Сначала создайте QIcon и передайте ему путь к изображению ./assets/editor.png.
- Во-вторых, передайте объект QIcon методу setWindowIcon(), чтобы установить значок для окна.
Как установить геометрию для главного окна
Геометрия определяет координаты окна(x,y) или(сверху, слева), а также ширину и высоту окна:
Чтобы задать геометрию для окна, используйте метод setGeometry() объекта QMainWindow. Например, следующий код использует метод setGeometry() для задания геометрии для окна:
self.setGeometry(100, 100, 500, 300)
В этом примере окно появится в точке(100, 100) с шириной 500 пикселей и высотой 300 пикселей:
Следующая программа создает главное окно с помощью QMainWindow, устанавливает центральный виджет, а также заголовок, значок и геометрию окна:
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QToolBar, QStatusBar from PyQt6.QtGui import QIcon, QAction class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('Editor') self.setWindowIcon(QIcon('./assets/editor.png')) self.setGeometry(100, 100, 500, 300) self.text_edit = QTextEdit(self) self.setCentralWidget(self.text_edit) self.show() if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
Добавление строки меню
Чтобы добавить строку меню в главное окно, используйте метод menuBar() объекта QMainWindow:
menu_bar = self.menuBar()
Метод menuBar() возвращает объект QMenuBar. Если объект QMenuBar не существует, menuBar() создаст новый объект QMenuBar перед его возвратом. В противном случае он возвращает существующий объект QMenuBar.
По умолчанию строка меню пуста. Чтобы добавить меню в строку меню, используйте метод addMenu(). Например, следующий код добавляет три подменю File, Edit и Help:
file_menu = menu_bar.addMenu('&File') edit_menu = menu_bar.addMenu('&Edit') help_menu = menu_bar.addMenu('&Help')
Метод addMenu() возвращает объект QMenu, представляющий раскрывающееся подменю. Строка, которую мы передаем методу addMenu(), предназначена для маркировки меню в строке меню.
Символ & подчеркнет символ метки меню при нажатии клавиши ALT. Например, &File подчеркнет букву F.
Действие
Чтобы добавить пункты меню в меню, необходимо создать действия. Действие — это объект класса QAction, который представляет функциональность приложения.
Объект действия требует имени и обратного вызова для правильной работы. Кроме того, действие может содержать значок и сочетание клавиш.
Чтобы создать действие, вы можете вызвать метод addAction() QMenu. Например, следующий код добавляет три действия в меню Файл:
file_menu.addAction('New', lambda: self.text_edit.clear()) file_menu.addAction('Open', lambda: print('Open')) file_menu.addAction('Exit', self.destroy)
Если вы нажмете на пункт меню New, виджет QTextEdit очистит все содержимое. Аналогично, нажав на пункт меню Open, вы увидите сообщение на консоли, а нажав на меню Exit, вы завершите программу.
Также вы можете создать объект QAction и подключить его сработавший сигнал к слоту. Например, следующий код создает действия отмены и повтора и добавляет их в меню «Edit»:
undo_action = QAction(QIcon('./assets/undo.png'), 'Undo', self) 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.setShortcut('Ctrl+Y') redo_action.triggered.connect(self.text_edit.redo) edit_menu.addAction(redo_action)
Обратите внимание, что для отмены и повтора действий имеются значки и сочетания клавиш.
Следующая программа показывает, как добавить строку меню и пункты меню в меню File и Edit:
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QToolBar, QStatusBar from PyQt6.QtGui import QIcon, QAction class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('Editor') self.setWindowIcon(QIcon('./assets/editor.png')) self.setGeometry(100, 100, 500, 300) self.text_edit = QTextEdit(self) self.setCentralWidget(self.text_edit) # setting menu menu_bar = self.menuBar() file_menu = menu_bar.addMenu('&File') edit_menu = menu_bar.addMenu('&Edit') help_menu = menu_bar.addMenu('&Help') file_menu.addAction('New', lambda: self.text_edit.clear()) file_menu.addAction('Open', lambda: print('Open')) file_menu.addAction('Exit', self.destroy) undo_action = QAction(QIcon('./assets/undo.png'), 'Undo', self) 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.setShortcut('Ctrl+Y') redo_action.triggered.connect(self.text_edit.redo) edit_menu.addAction(redo_action) self.show() if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
Выход:
Добавление панели инструментов
Панель инструментов — это панель иконок и/или текста, которая отображает наиболее часто используемые функции приложения. Чтобы добавить панель инструментов в приложение:
- Сначала создайте новый объект QToolBar.
- Во-вторых, добавьте панель инструментов в приложение с помощью метода addToolbar() QMainWindow.
Например, следующий код создает новую панель инструментов и добавляет ее в приложение:
toolbar = QToolBar('Main toolbar') self.addToolBar(toolbar)
Чтобы добавить элемент на панель инструментов, используйте метод addAction() объекта QToolBar. Например:
toolbar.addAction(undo_action) toolbar.addAction(redo_action)
Следующая программа показывает добавление панели инструментов с функциями отмены и повтора действий:
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QToolBar from PyQt6.QtGui import QIcon, QAction class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('Editor') self.setWindowIcon(QIcon('./assets/editor.png')) self.setGeometry(100, 100, 500, 300) self.text_edit = QTextEdit(self) self.setCentralWidget(self.text_edit) # setting menu menu_bar = self.menuBar() file_menu = menu_bar.addMenu('&File') edit_menu = menu_bar.addMenu('&Edit') help_menu = menu_bar.addMenu('&Help') file_menu.addAction('New', lambda: self.text_edit.clear()) file_menu.addAction('Open', lambda: print('Open')) file_menu.addAction('Exit', self.destroy) undo_action = QAction(QIcon('./assets/undo.png'), 'Undo', self) 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.setShortcut('Ctrl+Y') redo_action.triggered.connect(self.text_edit.redo) edit_menu.addAction(redo_action) # adding a toolbar toolbar = QToolBar('Main toolbar') self.addToolBar(toolbar) toolbar.addAction(undo_action) toolbar.addAction(redo_action) self.show() if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
Добавление строки состояния
Строка состояния — это панель, расположенная в нижней части главного окна. Обычно строка состояния отображает короткие текстовые сообщения и/или информационные виджеты.
Чтобы добавить строку состояния в приложение, необходимо создать объект QStatusBar и установить его в главном окне с помощью метода setStatusBar():
status_bar = QStatusBar() self.setStatusBar(status_bar)
Метод statusBar() QMainWindow возвращает объект QStatusBar. Он создаст новый объект QStatusBar, если строка состояния не существует.
Для отображения короткого сообщения используйте метод showMessage() объекта QStatusBar:
status_bar.showMessage('Awesome Editor v1.0')
Или вы можете напрямую использовать объект QStatusBar, возвращаемый методом statusBar() главного окна:
self.status_bar.showMessage('Awesome Editor v1.0')
Следующая программа показывает строку состояния:
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QToolBar, QStatusBar from PyQt6.QtGui import QIcon, QAction class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('Editor') self.setWindowIcon(QIcon('./assets/editor.png')) self.setGeometry(100, 100, 500, 300) self.text_edit = QTextEdit(self) self.setCentralWidget(self.text_edit) # setting menu menu_bar = self.menuBar() file_menu = menu_bar.addMenu('&File') edit_menu = menu_bar.addMenu('&Edit') help_menu = menu_bar.addMenu('&Help') file_menu.addAction('New', lambda: self.text_edit.clear()) file_menu.addAction('Open', lambda: print('Open')) file_menu.addAction('Exit', self.destroy) undo_action = QAction(QIcon('./assets/undo.png'), 'Undo', self) 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.setShortcut('Ctrl+Y') redo_action.triggered.connect(self.text_edit.redo) edit_menu.addAction(redo_action) # adding a toolbar toolbar = QToolBar('Main toolbar') self.addToolBar(toolbar) toolbar.addAction(undo_action) toolbar.addAction(redo_action) # status bar self.status_bar = QStatusBar() self.setStatusBar(self.status_bar) self.status_bar.showMessage('Awesome Editor v1.0') self.show() if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
Выход: