Главная страница

ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов


Скачать 7.92 Mb.
НазваниеНиколай Прохоренок Владимир Дронов
Дата05.05.2023
Размер7.92 Mb.
Формат файлаpdf
Имя файлаПрохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен.pdf
ТипДокументы
#1111379
страница63 из 83
1   ...   59   60   61   62   63   64   65   66   ...   83
)
, генерируемого при активизации вкладки щелчком на ее заголовке. Активизированная вкладка передается обработчику с единственным параметром.
27.2. Меню
Главное меню позволяет компактно поместить в главное окно множество команд, объеди- ненных в логические группы. Оно состоит из горизонтальной панели (реализуемой классом
QMenuBar
), на которой расположены отдельные меню (реализуются с помощью класса
QMenu
) верхнего уровня. Каждое меню может содержать множество пунктов (представляемых классом
QAction
), разделители и вложенные меню. Пункт меню может содержать значок, текст и флажок, превращающий его в переключатель.
Помимо главного меню, в приложениях часто используются контекстные меню, которые обычно отображаются при щелчке правой кнопкой мыши в области компонента. Контекст- ное меню реализуется с помощью класса
QMenu и отображается внутри метода с предопре- деленным именем contextMenuEvent()
с помощью метода exec()
(или оставленного для совместимости с предыдущей версией PyQt метода exec_()
), в который передаются гло- бальные координаты щелчка мышью.
27.2.1. Класс QMenuBar
Класс
QMenuBar описывает горизонтальную панель меню. Панель меню реализована в глав- ном окне приложения по умолчанию. Получить ссылку на нее можно вызовом мето- да menuBar()
класса
QMainWindow
. Установить свою панель меню позволяет метод setMenuBar()
. Иерархия наследования для класса
QMenuBar выглядит так:
(QObject, QPaintDevice) — QWidget — QMenuBar
Конструктор класса
QMenuBar имеет следующий формат:
<Объект> = QMenuBar([parent=None])
В параметре parent указывается ссылка на родительское окно.
Класс
QMenuBar наследует все методы базовых классов и поддерживает следующие допол- нительные методы (здесь приведены только интересующие нас — полный их список можно найти на странице https://doc.qt.io/qt-5/qmenubar.html):
 addMenu()
— добавляет меню на панель и возвращает экземпляр класса
QAction
, с помощью которого, например, можно скрыть меню (вызовом метода setVisible()
) или сделать его неактивным (вызовом метода setEnabled()
);
 addMenu([, ]<Название>)
— создает меню, добавляет его на панель и возвращает ссылку на него (экземпляр класса
QMenu
). Внутри текста в параметре
<Название>
символ
&
, указанный перед буквой или цифрой, задает комбинацию клавиш быстрого доступа.
В этом случае символ, перед которым указан символ
&
, будет — в качестве подсказки пользователю — подчеркнут. При одновременном нажатии клавиши и подчеркну- того символа меню окажется выбранным. Чтобы вывести сам символ
&
, необходимо его удвоить. В первом параметре можно указать значок, который будет выведен левее надписи меню;
 insertMenu(, )
— добавляет меню

перед пунктом

Метод возвращает экземпляр класса
QAction
;

654
Часть II. Библиотека PyQt 5
 addAction()
— добавляет пункт в меню. Форматы метода: addAction() addAction(<Название>) -> QAction addAction(<Название>, <Обработчик>) -> QAction
Первый формат просто добавляет заданный в виде действия (экземпляра класса
QAction
) пункт в меню. Второй и третий создают действие, добавляют его в меню и возвращают в качестве результата;
 clear()
— удаляет все действия из панели меню;
 setActiveAction()
— делает активным указанное действие;
 activeAction()
— возвращает активное действие (экземпляр класса
QAction
) или значе- ние
None
;
 setDefaultUp(<Флаг>)
— если в качестве параметра указано значение
True
, пункты меню будут отображаться выше панели меню, а не ниже;
 setVisible(<Флаг>)
— если в качестве параметра указано значение
False
, панель меню будет скрыта. Значение
True отображает панель меню.
Класс
QMenuBar поддерживает следующие сигналы:
 hovered()
— генерируется при наведении указателя мыши на пункт меню, ко- торый передается обработчику в качестве параметра;
 triggered()
— генерируется при выборе пункта меню, который передается обработчику в качестве параметра.
27.2.2. Класс QMenu
Класс
QMenu реализует отдельное меню на панели меню, а также вложенное, плавающее и контекстное меню. Его иерархия наследования выглядит так:
(QObject, QPaintDevice) — QWidget — QMenu
Форматы конструктора класса
QMenu
:
<Объект> = QMenu([parent=None])
<Объект> = QMenu(<Название>[, parent=None])
В параметре parent указывается ссылка на родительский компонент. Внутри текста в пара- метре
<Название>
символ
&
, указанный перед буквой или цифрой, задает комбинацию кла- виш быстрого доступа. В этом случае символ, перед которым указан символ
&
, будет — в качестве подсказки пользователю — подчеркнут. При одновременном нажатии клавиши
и подчеркнутого символа меню окажется выбранным. Чтобы вывести сам символ
&
, необходимо его удвоить.
Помимо унаследованных из базовых классов, класс
QMenu поддерживает ряд своих методов
(здесь приведены только основные — полный их список можно найти на странице https://doc.qt.io/qt-5/qmenu.html):
 addAction()
— добавляет пункт в меню. Форматы метода: addAction() addAction(<Название>) -> QAction addAction(, <Название>) -> QAction

Глава 27. Создание SDI- и MDI-приложений
655 addAction(<Название>, <Обработчик>[, shortcut=0])
-> QAction addAction(, <Название>, <Обработчик>[, shortcut=0])
-> QAction
Внутри текста в параметре
<Название>
символ
&
, указанный перед буквой или цифрой, задает комбинацию клавиш быстрого доступа. В этом случае символ, перед которым указан символ
&
, будет — в качестве подсказки пользователю — подчеркнут. При одно- временном нажатии клавиши и подчеркнутого символа меню окажется выбран- ным. Чтобы вывести сам символ
&
, необходимо его удвоить. Нажатие комбинации кла- виш быстрого доступа сработает только в том случае, если меню, в котором находится пункт, является активным.
Параметр shortcut задает комбинацию «горячих» клавиш, нажатие которых аналогично выбору пункта в меню. Нажатие комбинации «горячих» клавиш сработает даже в том случае, если меню не является активным. Вот примеры указания значения в параметре shortcut
:
QtGui.QKeySequence("Ctrl+R")
QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_R))
QtGui.QKeySequence.fromString("Ctrl+R")
 addSeparator()
— добавляет разделитель в меню и возвращает представляющий его экземпляр класса
QAction
;
 addSection()
— добавляет в меню секцию, которая выглядит как разделитель с заголов- ком и, возможно, значком. Форматы метода: addSection(<Заголовок>) addSection(<Заголовок>, )
Первый формат создает секцию с одним лишь текстовым заголовком, второй — с заго- ловком и значком. Метод возвращает экземпляр класса
QAction
, представляющий соз- данную секцию;
 insertMenu(, )
— добавляет вложенное меню

перед пунктом

. Метод возвращает экземпляр класса
QAction
;
 insertSeparator()
— добавляет разделитель перед указанным пунктом и воз- вращает представляющий разделитель экземпляр класса
QAction
;
 insertSection()
— добавляет секцию перед пунктом

. Форматы метода: insertSection(, <Заголовок>) insertSection(, <Заголовок>, )
Первый формат вставляет секцию с одним лишь текстовым заголовком, второй — с за- головком и значком. Метод возвращает экземпляр класса
QAction
, представляющий соз- данную секцию;
 addMenu()
— добавляет вложенное меню и возвращает представляющий его экземпляр класса
QAction
;
 addMenu([, ]<Название>)
создает вложенное меню, добавляет его в меню и возвращает ссылку на него (экземпляр класса
QMenu
);
 clear()
— удаляет все действия из меню;
 isEmpty()
— возвращает значение
True
, если меню не содержит видимых пунктов, и
False
— в противном случае;

656
Часть II. Библиотека PyQt 5
 menuAction()
— возвращает объект действия (экземпляр класса
QAction
), связанный с данным меню. С помощью этого объекта можно скрыть меню (вызовом метода setVisible()
) или сделать его неактивным (вызовом метода setEnabled()
);
 setTitle(<Название>)
— задает название меню;
 title()
— возвращает название меню;
 setIcon()
— задает значок меню;
 icon()
— возвращает значок меню (экземпляр класса
QIcon
);
 setActiveAction()
— делает активным указанный пункт;
 activeAction()
— возвращает активный пункт (экземпляр класса
QAction
) или значение
None
;
 setDefaultAction()
— задает пункт по умолчанию;
 defaultAction()
— возвращает пункт по умолчанию (экземпляр класса
QAction
) или значение
None
;
 setTearOffEnabled(<Флаг>)
— если в качестве параметра указано значение
True
, в нача- ло меню добавляется пункт с пунктирной линией, с помощью щелчка на котором можно оторвать меню от панели и сделать его плавающим (отображаемым в отдельном окне, которое можно разместить в любой части экрана);
 isTearOffEnabled()
— возвращает значение
True
, если меню может быть плавающим, и
False
— в противном случае;
 isTearOffMenuVisible()
— возвращает значение
True
, если плавающее меню отобража- ется в отдельном окне, и
False
— в противном случае;
 showTearOffMenu([])
— принудительно открывает меню, для которого была указана такая возможность, и помещает его либо в точке, заданной (в виде экземпляра класса
QPoint
) в параметре, либо, если параметр не указан, в точке, где расположен кур- сор мыши. Поддерживается, начиная с PyQt 5.7;
 hideTearOffMenu()
— скрывает плавающее меню;
 setSeparatorsCollapsible(<Флаг>)
— если в качестве параметра указано значение
True
, вместо нескольких разделителей, идущих подряд, будет отображаться один. Кроме того, разделители, расположенные по краям меню, также будут скрыты;
 setToolTipsVisible(<Флаг>)
— если передано значение
True
, заданная для меню всплы- вающая подсказка будет отображаться на экране, если
False
— не будет (поведение по умолчанию). Всплывающую подсказку для меню можно задать вызовом метода setToolTip(<Текст>)
, унаследованным от класса
QWidget
;
 popup([, ])
— отображает меню по указанным глобальным коорди- натам. Если указан второй параметр, меню отображается таким образом, чтобы по коор- динатам был расположен указанный пункт меню;
 exec([][, action=None]])
— отображает меню по указанным глобальным ко- ординатам и возвращает экземпляр класса
QAction
(соответствующий выбранному пунк- ту) или значение
None
(если пункт не выбран — например, нажата клавиша ). Если в параметре action указано действие (экземпляр класса
QAction
), меню отображается таким образом, чтобы по координатам был расположен соответствующий пункт меню;
 exec(<Список с экземплярами класса QAction>, [, at=None][, parent=None])
— выводит меню по указанным глобальным координатам и возвращает экземпляр класса

Глава 27. Создание SDI- и MDI-приложений
657
QAction
(соответствующий выбранному пункту) или значение
None
(если пункт не вы- бран — например, нажата клавиша ). Если в параметре at указано действие
(экземпляр класса
QAction
), меню отображается таким образом, чтобы по координатам был расположен соответствующий пункт меню. В параметре parent можно указать ссылку на родительский компонент. Метод является статическим.
Класс
QMenu поддерживает следующие сигналы:
 hovered()
— генерируется при наведении указателя мыши на пункт меню, который передается в обработчик в параметре;
 triggered()
— генерируется при выборе пункта меню, который передается в обработчик в параметре;
 aboutToShow()
— генерируется перед отображением меню;
 aboutToHide()
— генерируется перед скрытием меню.
27.2.3. Контекстное меню компонента
Чтобы создать для компонента контекстное меню, также можно воспользоваться соответст- вующими методами класса
QWidget
:
 addAction()
— добавляет пункт в конец меню;
 addActions(<Список с экземплярами класса QAction>)
— добавляет несколько пунктов в конец меню;
 insertAction(, )
— добавляет пункт

перед пунк- том

;
 insertActions(, <Список с экземплярами класса QAction>)
— добавляет не- сколько пунктов, указанных во втором параметре перед пунктом

;
 actions()
— возвращает список с действиями (экземпляры класса
QAction
);
 removeAction()
— удаляет указанное действие из меню.
Необходимо также наследовать класс компонента и переопределить метод с названием contextMenuEvent(self, )
. Этот метод будет автоматически вызываться при щелчке правой кнопкой мыши в области компонента. Внутри метода через параметр

досту- пен экземпляр класса
QContextMenuEvent
, который позволяет получить дополнительную информацию о событии. Класс
QContextMenuEvent поддерживает следующие основные методы:
 x()
и y()
— возвращают координаты по осям
X
и
Y
соответственно в пределах области компонента;
 pos()
— возвращает экземпляр класса
QPoint с целочисленными координатами в преде- лах области компонента;
 globalX()
и globalY()
— возвращают координаты по осям
X
и
Y
соответственно в преде- лах экрана;
 globalPos()
— возвращает экземпляр класса
QPoint с координатами в пределах экрана.
Чтобы вывести собственно контекстное меню, внутри метода contextMenuEvent()
следует вызвать метод exec()
(или exec_()
) объекта меню и передать ему результат выполнения метода globalPos()
:

658
Часть II. Библиотека PyQt 5 def contextMenuEvent(self, event): self.context_menu.exec_(event.globalPos())
В этом примере меню создано внутри конструктора класса и сохранено в атрибуте context_menu
. Если контекстное меню постоянно обновляется, его можно создавать при каждом вызове внутри метода contextMenuEvent()
непосредственно перед выводом.
27.2.4. Класс QAction
Класс
QAction описывает объект действия, который можно добавить в меню, на панель ин- струментов или прикрепить к какому-либо компоненту в качестве пункта его контекстного меню. Один и тот же объект действия допускается добавлять в несколько мест — например, в меню и на панель инструментов, — это позволяет управлять видимостью и доступностью действия централизованно. Иерархия наследования для класса
QAction следующая:
QObject — QAction
Форматы конструктора класса
QAction
:
<Объект> = QAction()
<Объект> = QAction(<Название>, )
<Объект> = QAction(, <Название>, )
В параметре

указывается ссылка на родительский компонент или значение
None
(начиная с PyQt 5.7, этот параметр является необязательным). Внутри текста в параметре
<Название>
символ
&
, указанный перед буквой или цифрой, задает комбинацию клавиш быстрого доступа. В этом случае символ, перед которым указан символ
&
, будет — в качестве подсказки пользователю — подчеркнут. При одновременном нажатии клавиши и подчеркнутого символа меню окажется выбранным. Чтобы вывести сам символ
&
, необхо- димо его удвоить. Параметр

устанавливает значок.
Класс
QAction поддерживает следующие основные методы (полный их список можно найти на странице https://doc.qt.io/qt-5/qaction.html):
 setText(<Название>)
— задает название действия. Внутри текста в параметре
<Название>
символ
&
, указанный перед буквой или цифрой, задает комбинацию клавиш быстрого доступа. Нажатие комбинации клавиш быстрого доступа сработает только в том случае, если меню, в котором находится пункт, является активным;
 text()
— возвращает название действия;
 setIcon()
— устанавливает значок;
 icon()
— возвращает значок (экземпляр класса
QIcon
);
 setIconVisibleInMenu(<Флаг>)
— если в качестве параметра указано значение
False
, значок в меню отображаться не будет;
 setSeparator(<Флаг>)
— если в качестве параметра указано значение
True
, объект станет разделителем;
 isSeparator()
— возвращает значение
True
, если объект является разделителем, и
False
— в противном случае;
 setShortcut()
— задает комбинацию «горячих» клавиш. Нажатие ком- бинации «горячих» клавиш по умолчанию сработает даже в том случае, если меню не является активным. Вот примеры указания значения:

Глава 27. Создание SDI- и MDI-приложений
659
"Ctrl+O"
QtGui.QKeySequence("Ctrl+O")
QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_O))
QtGui.QKeySequence.fromString("Ctrl+O")
QtGui.QKeySequence.Open
 setShortcuts()
— позволяет задать сразу несколько комбинаций «горячих» клавиш.
Форматы метода: setShortcuts(<Список с экземплярами класса QKeySequence>) setShortcuts(<Стандартная комбинация клавиш>)
В параметре
<Стандартная комбинация клавиш>
указываются атрибуты из перечисления
StandardKey класса
QKeySequence
(например,
Open
,
Close
,
Copy
,
Cut и т. д. — полный их список можно найти в документации по классу
QKeySequence
);
 setShortcutContext(<Область>)
— задает область действия комбинации «горячих» кла- виш. В качестве параметра указываются следующие атрибуты класса
QtCore.Qt
:

WidgetShortcut

0
— комбинация доступна, если родительский компонент имеет фокус;
1   ...   59   60   61   62   63   64   65   66   ...   83


написать администратору сайта