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

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


Скачать 7.92 Mb.
НазваниеНиколай Прохоренок Владимир Дронов
Дата05.05.2023
Размер7.92 Mb.
Формат файлаpdf
Имя файлаПрохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен.pdf
ТипДокументы
#1111379
страница57 из 83
1   ...   53   54   55   56   57   58   59   60   ...   83
QGraphicsSceneHoverEvent
;
 hoverLeaveEvent(self, )
— вызывается, когда указатель мыши покидает область объекта. Через параметр

доступен экземпляр класса
QGraphicsSceneHoverEvent
;

Глава 25. Графическая сцена
609
 hoverMoveEvent(self, )
— вызывается при перемещении указателя мыши внут- ри области объекта. Через параметр

доступен экземпляр класса
QGraphicsSceneHoverEvent
;
 wheelEvent(self, )
— вызывается при повороте колесика мыши при нахожде- нии указателя мыши над объектом. Чтобы обрабатывать событие, в любом случае следу- ет захватить мышь. Через параметр

доступен экземпляр класса
QGraphicsSceneWheelEvent
Следует учитывать, что методы hoverEnterEvent()
, hoverLeaveEvent()
и hoverMoveEvent()
будут вызваны только в том случае, если обработка этих событий разрешена. Чтобы раз- решить обработку событий перемещения мыши, следует вызвать метод setAcceptHoverEvents(<Флаг>)
класса
QGraphicsItem и передать ему значение
True
. Значе- ние
False запрещает обработку событий перемещения указателя. Получить текущее состоя- ние позволяет метод acceptHoverEvents()
Класс
QGraphicsSceneHoverEvent наследует все методы классов
QGraphicsSceneEvent и
QEvent и добавляет поддержку своих методов:
 pos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в преде- лах области объекта;
 scenePos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в пределах сцены;
 screenPos()
— возвращает экземпляр класса
QPoint с координатами указателя мыши в пределах экрана;
 lastPos()
— возвращает экземпляр класса
QPointF
с координатами последней запом- ненной представлением позиции мыши в пределах области объекта;
 lastScenePos()
— возвращает экземпляр класса
QPointF
с координатами последней запомненной представлением позиции мыши в пределах сцены;
 lastScreenPos()
— возвращает экземпляр класса
QPoint с координатами последней запомненной представлением позиции мыши в пределах экрана;
 modifiers()
— возвращает комбинацию обозначений всех клавиш-модификаторов
(, , и др.), что были нажаты одновременно с перемещением мыши.
Класс
QGraphicsSceneWheelEvent наследует все методы из классов
QGraphicsSceneEvent и
QEvent и добавляет поддержку следующих методов:
 delta()
— возвращает расстояние поворота колесика, измеряемое в
1
/
8
°. Положительное значение означает, что колесико поворачивалось в направлении от пользователя, отри- цательное — к пользователю;
 orientation()
— возвращает направление вращения колесика в виде значения одного из следующих атрибутов класса
QtCore.Qt
:

Horizontal

1
— по горизонтали;

Vertical

2
— по вертикали;
 pos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в преде- лах области объекта;
 scenePos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в пределах сцены;

610
Часть II. Библиотека PyQt 5
 screenPos()
— возвращает экземпляр класса
QPoint с координатами указателя мыши в пределах экрана;
 buttons()
— возвращает комбинацию обозначений всех кнопок мыши, нажатых одно- временно с вращением колесика;
 modifiers()
— возвращает комбинацию обозначений всех клавиш-модификаторов
(, , и др.), что были нажаты одновременно с вращением колесика.
25.7.3. Обработка перетаскивания и сброса
Прежде чем обрабатывать перетаскивание и сброс, необходимо сообщить системе, что гра- фический объект может их обработать. Для этого следует вызвать метод setAcceptDrops()
класса
QGraphicsItem и передать ему значение
True
Обработка перетаскивания и сброса в графическом объекте выполняется следующим об- разом:
 внутри метода dragEnterEvent()
проверяется MIME-тип перетаскиваемых данных и действие. Если графический объект способен обработать сброс этих данных и соглаша- ется с предложенным действием, необходимо вызвать метод acceptProposedAction()
объекта события. Если нужно изменить действие, методу setDropAction()
объекта собы- тия передается новое действие, а затем у того же объекта вызывается метод accept()
вместо метода acceptProposedAction()
;
 если необходимо ограничить область сброса некоторым участком графического объекта, можно дополнительно определить в нем метод dragMoveEvent()
. Этот метод будет по- стоянно вызываться при перетаскивании внутри области графического объекта. При со- гласии со сбрасыванием следует вызвать у объекта события метод accept()
;
 внутри метода dropEvent()
производится обработка сброса.
Обработать события, возникающие при перетаскивании и сбрасывании объектов, позволя- ют следующие методы:
 dragEnterEvent(self, )
— вызывается, когда перетаскиваемый объект входит в область графического объекта. Через параметр

доступен экземпляр класса
QGraphicsSceneDragDropEvent
;
 dragLeaveEvent(self, )
— вызывается, когда перетаскиваемый объект покидает область графического объекта. Через параметр

доступен экземпляр класса
QGraphicsSceneDragDropEvent
;
 dragMoveEvent(self, )
— вызывается при перетаскивании объекта внутри об- ласти графического объекта. Через параметр

доступен экземпляр класса
QGraphicsSceneDragDropEvent
;
 dropEvent(self, )
— вызывается при сбрасывании объекта в области гра- фического объекта. Через параметр

доступен экземпляр класса
QGraphicsSceneDragDropEvent
Класс
QGraphicsSceneDragDropEvent наследует все методы классов
QGraphicsSceneEvent и
QEvent и добавляет поддержку методов:
 mimeData()
— возвращает экземпляр класса
QMimeData с перемещаемыми данными и ин- формацией о MIME-типе;

Глава 25. Графическая сцена
611
 pos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в преде- лах области объекта;
 scenePos()
— возвращает экземпляр класса
QPointF
с координатами указателя мыши в пределах сцены;
 screenPos()
— возвращает экземпляр класса
QPoint с координатами указателя мыши в пределах экрана;
 possibleActions()
— возвращает комбинацию возможных действий при сбрасывании;
 proposedAction()
— возвращает действие по умолчанию при сбрасывании;
 acceptProposedAction()
— подтверждает готовность принять перемещаемые данные и согласие с действием по умолчанию, возвращаемым методом proposedAction()
;
 setDropAction(<Действие>)
— указывает другое действие при сбрасывании. После изме- нения действия следует вызвать метод accept()
, а не acceptProposedAction()
;
 dropAction()
— возвращает действие, которое должно быть выполнено при сбрасы- вании;
 buttons()
— возвращает комбинацию обозначений всех кнопок мыши, нажатых в про- цессе перетаскивания;
 modifiers()
— возвращает комбинацию обозначений всех клавиш-модификаторов
(, , и др.), что были нажаты в процессе перетаскивания;
 source()
— возвращает ссылку на источник события или значение
None
25.7.4. Фильтрация событий
События можно перехватывать еще до того, как они будут переданы специализированному методу. Для этого в классе графического объекта необходимо переопределить метод sceneEvent(self, )
. Через параметр

здесь будет доступен объект с допол- нительной информацией о событии. Тип этого объекта различен для разных типов событий.
Внутри метода следует вернуть значение
True
, если событие обработано, и
False
— в про- тивном случае. Если вернуть значение
True
, специализированный метод (например, mousePressEvent()
) выполняться не будет.
Чтобы произвести фильтрацию событий какого-либо объекта, в классе графического объек- та необходимо переопределить метод sceneEventFilter(self, , )
Через параметр

здесь будет доступна ссылка на объект, в котором возник- ло событие, а через параметр

— объект с информацией о самом событии. Тип этого объекта различен для разных типов событий. Внутри метода следует вернуть значение
True
, если событие обработано, и
False
— в противном случае. Если вернуть значение
True
, объект, в котором возникло событие, не получит его.
Указать, события какого объекта фильтруются, позволяют следующие методы класса
QGraphicsItem
:
 installSceneEventFilter()
— задает объект, который будет произво- дить фильтрацию событий текущего объекта;
 removeSceneEventFilter()
— удаляет объект-фильтр событий;
 setFiltersChildEvents(<Флаг>)
— если в качестве параметра указано значение
True
, текущий объект будет производить фильтрацию событий всех своих дочерних объектов.

612
Часть II. Библиотека PyQt 5 25.7.5. Обработка изменения состояния объекта
Чтобы обработать изменение состояния объекта, следует переопределить метод itemChange(self, <Состояние>, <Значение>)
в классе графического объекта. Метод должен возвращать новое значение. Через параметр
<Состояние>
доступно состояние, которое было изменено, в виде значения одного из следующих атрибутов класса
QGraphicsItem
(здесь перечислены только основные
— полный их список можно найти на странице https://doc.qt.io/qt-5/qgraphicsitem.html#GraphicsItemChange-enum
):

ItemEnabledChange

3
— изменилось состояние доступности;

ItemEnabledHasChanged

13
— изменилось состояние доступности. Возвращаемое зна- чение игнорируется;

ItemPositionChange

0
— изменилась позиция объекта. Метод будет вызван, только если установлен флаг
ItemSendsGeometryChanges
;

ItemPositionHasChanged

9
— изменилась позиция объекта. Метод будет вызван, толь- ко если установлен флаг
ItemSendsGeometryChanges
. Возвращаемое значение игнориру- ется;

ItemScenePositionHasChanged

27
— изменилась позиция объекта на сцене с учетом преобразований, примененных к самому объекту и его родителям. Метод будет вызван, только если установлен флаг
ItemSendsScenePositionChanges
. Возвращаемое значение игнорируется;

ItemTransformChange

8
— изменилась матрица преобразований. Метод будет вызван, только если установлен флаг
ItemSendsGeometryChanges
;

ItemTransformHasChanged

10
— изменилась матрица преобразований. Метод будет вызван, только если установлен флаг
ItemSendsGeometryChanges
. Возвращаемое значение игнорируется;

ItemSelectedChange

4
— изменилось выделение объекта;

ItemSelectedHasChanged

14
— изменилось выделение объекта. Возвращаемое значе- ние игнорируется;

ItemVisibleChange

2
изменилось состояние видимости объекта;

ItemVisibleHasChanged

12
— изменилось состояние видимости объекта. Возвращае- мое значение игнорируется;

ItemCursorChange

17
— изменился курсор;

ItemCursorHasChanged

18
— изменился курсор. Возвращаемое значение игнорируется;

ItemToolTipChange

19
— изменилась всплывающая подсказка;

ItemToolTipHasChanged

20
— изменилась всплывающая подсказка. Возвращаемое значение игнорируется;

ItemFlagsChange

21
— изменились флаги;

ItemFlagsHaveChanged

22
— изменились флаги. Возвращаемое значение игнорируется;

ItemZValueChange

23
— изменилось положение по оси
Z
;

ItemZValueHasChanged

24
— изменилось положение по оси
Z
. Возвращаемое значение игнорируется;

ItemOpacityChange

25
— изменилась прозрачность объекта;

Глава 25. Графическая сцена
613

ItemOpacityHasChanged

26
— изменилась прозрачность объекта. Возвращаемое значе- ние игнорируется;

ItemParentChange

5
— изменился родитель объекта;

ItemParentHasChanged

15
— изменился родитель объекта. Возвращаемое значение игнорируется;

ItemChildAddedChange

6
— в объект был добавлен потомок;

ItemChildRemovedChange

7
— из объекта был удален потомок;

ItemSceneChange

11
— объект был перемещен на другую сцену;

ItemSceneHasChanged

16
— объект был перемещен на другую сцену. Возвращаемое значение игнорируется.
В
НИМАНИЕ
!
Вызов некоторых методов из метода itemChange() может привести к рекурсии. За подроб- ной информацией обращайтесь к документации по классу QGraphicsItem.
П
РИМЕЧАНИЕ
PyQt 5 также поддерживает помещение на сцену видеозаписей в качестве отдельных гра- фических объектов и создание анимации. За подробным описанием обращайтесь к доку- ментации по этой библиотеке.

ГЛ А В А
26
Диалоговые окна
Диалоговые окна предназначены для информирования пользователя и получения от него требуемых данных. В большинстве случаев окна подобного рода являются модальными
(т. е. блокирующими все окна приложения или только родительское окно) и отображаются на непродолжительный промежуток времени. Для работы с диалоговыми окнами в PyQt предназначен класс
QDialog
, который предоставляет множество специальных методов, по- зволяющих дождаться закрытия окна, определить статус его завершения и выполнить про- чие задачи. Класс
QDialog наследуют другие классы, которые реализуют готовые диалого- вые окна. Например, класс
QMessageBox предоставляет диалоговые окна для вывода сообще- ний, класс
QInputDialog
— для ввода данных, класс
QFileDialog
— для выбора каталога или файла и т. д.
Все рассмотренные в этой главе классы определены в модуле
QtWidgets
, если не указано иное.
26.1. Пользовательские диалоговые окна
Класс
QDialog реализует диалоговое окно. По умолчанию окно выводится с рамкой и заго- ловком, в котором расположены кнопки Справка и Закрыть. Размеры окна можно изме- нять с помощью мыши. Иерархия наследования для класса
QDialog выглядит так:
(QObject, QPaintDevice) — QWidget — QDialog
Конструктор класса
QDialog имеет следующий формат:
<Объект> = QDialog([parent=<Родитель>][, flags=<Тип окна>])
В параметре parent указывается ссылка на родительское окно. Если родитель не указан или имеет значение
None
, диалоговое окно будет центрироваться относительно экрана, если указана — относительно родительского окна (это также позволяет создать модальное диалоговое окно, которое будет блокировать только окно родителя, а не все окна прило- жения). Какие именно значения можно указать в параметре flags
, мы уже рассматривали в разд. 18.2. Тип окна по умолчанию —
Dialog
Класс
QDialog наследует все методы базовых классов и дополнительно реализует следую- щие методы (здесь приведены только основные — полный их список можно найти на стра- нице https://doc.qt.io/qt-5/qdialog.html):
 exec()
— отображает модальное диалоговое окно, дожидается закрытия окна и возвра- щает код возврата в виде значения следующих атрибутов класса
QDialog
:

Глава 26. Диалоговые окна
615

Accepted

1
— нажата кнопка OK;

Rejected

0
— нажата кнопка Cancel, кнопка Закрыть в заголовке окна или кла- виша .
Метод является слотом. Вместо него можно использовать метод exec_()
, предусмотрен- ный для совместимости с предыдущими версиями PyQt.
Вот пример отображения диалогового окна и обработки статуса внутри обработчика на- жатия кнопки (класс
MyDialog является наследником класса
QDialog
, а window
— ссылка на главное окно): def on_clicked(): dialog = MyDialog(window) result = dialog.exec_() if result == QtWidgets.QDialog.Accepted: print("Нажата кнопка OK")
# Здесь получаем данные из диалогового окна else: print("Нажата кнопка Cancel")
 accept()
— закрывает модальное диалоговое окно и устанавливает код возврата равным значению атрибута
Accepted класса
QDialog
. Метод является слотом. Обычно его соеди- няют с сигналом нажатия кнопки OK: self.btnOK.clicked.connect(self.accept)
 reject()
— закрывает модальное диалоговое окно и устанавливает код возврата равным значению атрибута
Rejected класса
QDialog
. Метод является слотом. Обычно его соеди- няют с сигналом нажатия кнопки Cancel: self.btnCancel.clicked.connect(self.reject)
 done(<Код возврата>)
— закрывает модальное диалоговое окно и устанавливает код возврата равным значению параметра. Метод является слотом;
 setResult(<Код возврата>)
— устанавливает код возврата;
 result()
— возвращает код завершения;
 setSizeGripEnabled(<Флаг>)
— если в качестве параметра указано значение
True
, то в правом нижнем углу диалогового окна будет отображен значок изменения размера, а если
False
— то скрыт (значение по умолчанию);
 isSizeGripEnabled()
— возвращает значение
True
, если значок изменения размера ото- бражается в правом нижнем углу диалогового окна, и
False
— в противном случае;
 setVisible(<Флаг>)
— если в параметре указано значение
True
, диалоговое окно будет отображено, а если значение
False
— то скрыто. Вместо этого метода можно пользо- ваться более удобными методами show()
и hide()
;
 open()
— отображает диалоговое окно в модальном режиме, но не дожидается его за- крытия. Блокируется только родительское окно, а не все окна приложения. Метод явля- ется слотом;
 setModal(<Флаг>)
— если в качестве параметра указано значение
True
, окно будет мо- дальным, а если
False
— обычным. Обратите внимание, что окно, открываемое с по- мощью метода exec()
1   ...   53   54   55   56   57   58   59   60   ...   83


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