ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов
Скачать 7.92 Mb.
|
) , генерируемого при активизации вкладки щелчком на ее заголовке. Активизированная вкладка передается обработчику с единственным параметром. 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( Первый формат просто добавляет заданный в виде действия (экземпляра класса 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( Глава 27. Создание SDI- и MDI-приложений 655 addAction(<Название>, <Обработчик>[, shortcut=0]) -> QAction addAction( -> 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( Первый формат вставляет секцию с одним лишь текстовым заголовком, второй — с за- головком и значком. Метод возвращает экземпляр класса 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([ — отображает меню по указанным глобальным ко- ординатам и возвращает экземпляр класса QAction (соответствующий выбранному пунк- ту) или значение None (если пункт не выбран — например, нажата клавиша QAction ), меню отображается таким образом, чтобы по координатам был расположен соответствующий пункт меню; exec(<Список с экземплярами класса QAction>, — выводит меню по указанным глобальным координатам и возвращает экземпляр класса Глава 27. Создание SDI- и MDI-приложений 657 QAction (соответствующий выбранному пункту) или значение None (если пункт не вы- бран — например, нажата клавиша (экземпляр класса QAction ), меню отображается таким образом, чтобы по координатам был расположен соответствующий пункт меню. В параметре parent можно указать ссылку на родительский компонент. Метод является статическим. Класс QMenu поддерживает следующие сигналы: hovered( — генерируется при наведении указателя мыши на пункт меню, который передается в обработчик в параметре; triggered( — генерируется при выборе пункта меню, который передается в обработчик в параметре; aboutToShow() — генерируется перед отображением меню; aboutToHide() — генерируется перед скрытием меню. 27.2.3. Контекстное меню компонента Чтобы создать для компонента контекстное меню, также можно воспользоваться соответст- вующими методами класса QWidget : addAction( — добавляет пункт в конец меню; addActions(<Список с экземплярами класса QAction>) — добавляет несколько пунктов в конец меню; insertAction( — добавляет пункт перед пунк- том ; insertActions( — добавляет не- сколько пунктов, указанных во втором параметре перед пунктом ; 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 — комбинация доступна, если родительский компонент имеет фокус; |