Шаг 274.
Библиотека PyQt5.
Создание SDI- и MDI-приложений. Меню. Класс QMenu
На этом шаге мы рассмотрим назначение, иерархию наследования и основные методы этого класса.
Класс QMenu реализует отдельное меню на панели меню, а также вложенное, плавающее и контекстное меню. Его иерархия наследования выглядит так:
(QObject, QPaintDevice) - QWidget - QMenu
Форматы конструктора класса QMenu:
<Объект> = QMenu([parent=None])
<Объект> = QMenu(<Название>[, parent=None])
В параметре parent указывается ссылка на родительский компонент. Внутри текста в параметре <Название> символ &, указанный
перед буквой или цифрой, задает комбинацию клавиш быстрого доступа. В этом случае символ, перед которым указан символ &, будет, в качестве
подсказки пользователю, подчеркнут. При одновременном нажатии клавиши Alt и подчеркнутого символа меню окажется выбранным. Чтобы вывести
сам символ &, необходимо его удвоить.
Помимо унаследованных из базовых классов, класс QMenu поддерживает ряд своих методов (здесь приведены только основные - полный их
список доступен на странице
https://doc.qt.io/qt-5/qmenu.html):
- addAction () - добавляет пункт в меню. Форматы метода:
addAction(<QAction>)
addAction(<Haзвание>) -> QAction
addAction(<QIcon>, <Название>) -> QAction
addAction(<Haзвание>, <Обработчик>[, <shortcut>]) -> QAction
addAction(<QIcon>, <Haзвание>, <Обработчик>[, shortcut=0]) -> QAction
Внутри текста в параметре <Haзвание> символ &, указанный перед буквой или цифрой, задает комбинацию клавиш быстрого
доступа. В этом случае символ, перед которым указан символ &, будет, в качестве подсказки пользователю, подчеркнут. При одновременном
нажатии клавиши Alt и подчеркнутого символа меню окажется выбранным. Чтобы вывести сам символ &, необходимо его удвоить.
Нажатие комбинации клавиш быстрого доступа сработает только в том случае, если меню, в котором находится пункт, является активным.
Параметр shortcut задает комбинацию "горячих" клавиш, нажатие которых аналогично выбору пункта в меню. Нажатие комбинации "горячих"
клавиш сработает даже в том случае, если меню не является активным. Вот примеры указания значения в параметре shortcut:
QtGui.QKeySequence("Ctrl+R")
QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_R))
QtGui.QKeySequence.fromString("Ctrl+R")
- addSeparator () - добавляет разделитель в меню и возвращает представляющий его экземпляр класса QAction;
- insertMenu (<QAction>, <QMenu>) - добавляет вложенное меню <QMenu> перед пунктом <QAction>. Метод возвращает экземпляр класса QAction;
- insertSeparator (<QAction>) - добавляет разделитель перед указанным пунктом и возвращает представляющий разделитель экземпляр класса QAction;
- addMenu (<QMenu>) - добавляет вложенное меню и возвращает представляющий его экземпляр класса QAction;
- addMenu ([<QIcon>, ]<Название>) - создает вложенное меню, добавляет его в меню и возвращает ссылку на него (экземпляр класса QMenu);
- clear () - удаляет все действия из меню;
- isEmpty () - возвращает значение True, если меню не содержит видимых пунктов, и False - в противном случае;
- menuAction () - возвращает объект действия (экземпляр класса QAction), связанный с данным меню. С помощью этого объекта
можно скрыть меню (вызовом метода setvisible()) или сделать его неактивным (вызовом метода setEnabled());
- setTitle (<Haзвание>) - задает название меню;
- title () - возвращает название меню;
- setIcon (<QIcon>) - задает значок меню;
- icon () - возвращает значок меню (экземпляр класса QIcon);
- setActiveAction (<QAction>) - делает активным указанный пункт;
- activeAction () - возвращает активный пункт (экземпляр класса QAction) или значение None;
- setDefaultAction (<QAction>) - задает пункт по умолчанию;
- defaultAction () - возвращает пункт по умолчанию (экземпляр класса QAction) или значение None;
- setTearOffEnabled (<Флаг>) - если в качестве параметра указано значение True, в начало меню добавляется пункт с пунктирной линией, с помощью щелчка на котором можно
оторвать меню от панели и сделать его плавающим (отображаемым в отдельном окне, которое можно разместить в любой части экрана);
- isTearOffEnabled () - возвращает значение True, если меню может быть плавающим, и False - в противном случае;
- isTearOffMenuVisible () - возвращает значение True, если плавающее меню отображается в отдельном окне, и False - в противном случае;
- hideTearOffMenu () - скрывает плавающее меню;
- setSeparatorsCollapsible (<Флаг>) - если в качестве параметра указано значение True, вместо нескольких разделителей, идущих подряд, будет отображаться один.
Кроме того, разделители, расположенные по краям меню, также будут скрыты;
- setToolTipsVisible (<Флаг>) - если передано значение True, заданная для меню всплывающая подсказка будет отображаться на экране, если False - не будет
(поведение по умолчанию). Всплывающую подсказку для меню можно задать вызовом методы setToolTip(<Текст>), унаследованным от класса QWidget;
- popup (<QPoint>[, <QAction>]) - отображает меню по указанным глобальным координатам. Если указан второй параметр, меню отображается таким образом, чтобы по координатам был расположен указанный пункт меню;
- ехес ([<QPoint>] [, action=None]]) - отображает меню по указанным глобальным координатам и возвращает экземпляр класса QAction (соответствующий выбранному
пункту) или значение None (если пункт не выбран - например, нажата клавиша Esc). Если в параметре action указано действие
(экземпляр класса QAction), меню отображается таким образом, чтобы по координатам был расположен соответствующий пункт меню;
- ехес (<Список с экземплярами класса QAction>, <QPoint>[, at=None][, parent=None]) - выводит меню по указанным глобальным координатам и возвращает экземпляр
класса QAction (соответствующий выбранному пункту) или значение None (если пункт не выбран - например, нажата клавиша Esc). Если в параметре at указано действие
(экземпляр класса QAction), меню отображается таким образом, чтобы по координатам был расположен соответствующий пункт меню. В параметре parent можно указать
ссылку на родительский компонент. Метод является статическим.
Класс QMenu поддерживает следующие сигналы:
- hovered (<QAction>) - генерируется при наведении указателя мыши на пункт меню, который передается в обработчик в параметре;
- triggered (<QAction>) - генерируется при выборе пункта меню, который передается в обработчик в параметре;
- aboutToSnow () - генерируется перед отображением меню;
- aboutToHide () - генерируется перед скрытием меню.
В заключение приведем небольшой пример, иллюстрирующий использование меню (пример взят здесь: https://pythonworld.ru/gui/pyqt5-menustoolbars.html):
# -*- 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.triggered.connect(qApp.quit)
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_())
Архив с файлами можно взять
здесь.
Результат работы приложения показан на рисунке 1.
Рис.1. Результат работы приложения
В приведенном выше примере, мы создаем строку меню с одним меню. Это меню будет содержать одно действие, которое будет прекращать программу.
Действие доступно с помощью Ctrl + Q.
QAction является абстракцией для действий, совершенных из меню, панели инструментов, или комбинаций клавиш. В первых двух строках метода initUI(), мы создаем действие
с соответствующей иконкой. Кроме того, для этого действия определяется комбинация клавиш.
Когда мы выбираем именно это действие, срабатывает сигнал (третья строка). Сигнал подключен к методу quit() виджета QApplication. Это завершает приложение.
Метод menuBar() создает строку меню. Мы создаем меню файла и добавляем к нему действие выхода.
На следующем шаге мы рассмотрим контекстное меню компонента.
Предыдущий шаг
Содержание
Следующий шаг