Создание главного окна с помощью PyQt QMainWindow в Python

Ранее вы узнали, как использовать QWidget для создания главного окна приложений. QWidget отлично работает для простых приложений, но не поддерживает общие функции полноценных настольных приложений, такие как строки меню, панели инструментов и строки состояния.

Содержание

Знакомство с PyQt QMainWindow

PyQt предоставляет вам QMainWindow, который поддерживает панель меню, панели инструментов и строку состояния из коробки. Поэтому вместо создания подкласса класса QWidget вы можете создать главное окно в Python, унаследовав его от класса QMainWindow следующим образом:

class MainWindow(QMainWindow):

PyQt делит виджет QMainWindow на несколько разделов, как показано на следующем рисунке:

Макет 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())

Выход:

Объект QAction

Добавление панели инструментов

Панель инструментов — это панель иконок и/или текста, которая отображает наиболее часто используемые функции приложения. Чтобы добавить панель инструментов в приложение:

  • Сначала создайте новый объект 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())

Выход:

Пример строки состояния

Похожие посты
Добавить комментарий

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