ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов
Скачать 7.92 Mb.
|
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() |