Меню и тулбары в PyQt5

В этой части учебника PyQt5, мы создадим меню и тулбар (панель инструментов). Меню представляет собой группу команд, расположенных в менюбаре. Панель инструментов содержит кнопки с некоторыми общими командами в приложении.

Главное окно

Класс QMainWindow предоставляет главное окно приложения. Это позволяет создать классический каркас приложений с статусбаром, тулбаром и меню.

Статусбар (строка состояния)

Строка состояния является виджетом, который используется для отображения информации о состоянии.

#!/usr/bin/python3
# -*- coding: utf-8 -*-


import sys
from PyQt5.QtWidgets import QMainWindow, QApplication


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.statusBar().showMessage('Ready')

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Statusbar')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Статусбар создаётся с помощью функции QMainWindow.

self.statusBar().showMessage('Ready')

Чтобы получить строку состояния, мы вызываем метод statusBar() класса QtGui.QMainWindow. Первый вызов метода создает строку состояния. Последующие вызовы возвращают объект статусбара. showMessage() отображает сообщение в строке состояния.

Строка меню

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

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        exitAction = QAction(QIcon('exit.png'), '&Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(qApp.quit)

        self.statusBar()

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Menubar')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

В приведенном выше примере, мы создаем строку меню с одним меню. Это меню будет содержать одно действие, которое будет прекращать программу. Строка состояния также создается. Действие доступно с помощью Ctrl + Q.

exitAction = QAction(QIcon('exit.png'), '&Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')

QAction является абстракцией для действий, совершенных из меню, панели инструментов, или комбинаций клавиш. В этих трех строках, мы создаем действие с соответствующей иконкой. Кроме того, для этого действия определяется комбинация клавиш. Третья строка создает подсказку, которая показывается в строке состояния, когда вы наведёте указатель мыши на пункт меню.

exitAction.triggered.connect(qApp.quit)

Когда мы выбираем именно это действие, срабатывает сигнал. Сигнал подключен к методу quit() виджета QApplication. Это завершает приложение.

menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)

Метод menuBar() создает строку меню. Мы создаем меню файла и добавляем к нему действие выхода.

Панель инструментов (тулбар)

Меню группируют все команды, которые мы можем использовать в приложении.

Панели инструментов обеспечивают быстрый доступ к наиболее часто используемым командам.

#!/usr/bin/python3
# -*- coding: utf-8 -*-


import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(qApp.quit)

        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAction)

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Toolbar')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Здесь практически всё аналогично статусбару.

Toolbar

Объединяя все вместе

В последнем примере этого раздела мы создадим строку меню, панель инструментов и статусную строку. Мы также создадим центральный виджет.

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplication
from PyQt5.QtGui import QIcon


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        textEdit = QTextEdit()
        self.setCentralWidget(textEdit)

        exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(self.close)

        self.statusBar()

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)

        toolbar = self.addToolBar('Exit')
        toolbar.addAction(exitAction)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Main window')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Данный пример кода создает скелет классического приложения с графическим интерфейсом с меню, тулбаром и статусбаром.

textEdit = QTextEdit()
self.setCentralWidget(textEdit)

Здесь мы создаем виджет редактирования текста. Мы его назначаем центральным виджетом QMainWindow. Центральный виджет занимает все пространство, которое осталось.

Main window

В этой части урока PyQt5, мы работали с меню, панелью инструментов, строкой состояния и главным окном приложения.

Для вставки кода на Python в комментарий заключайте его в теги <pre><code class="python3">Ваш код</code></pre>
Ошибка в тексте:
Послать сообщение об ошибке автору?