Тип QML PointHandler
Обработчик для реакции на одну точку касания. Подробнее...
| Заявление об импорте: | import QtQuick 2.15 |
| Наследует: |
Свойства
- acceptedButtons : flags
- acceptedDevices : flags
- acceptedModifiers : flags
- acceptedPointerTypes : flags
- active : bool
- cursorShape : Qt::CursorShape
- dragThreshold : int
- enabled : bool
- grabPermissions : flags
- margin : real
- parent : Item
- point : HandlerPoint
- target : Item
Сигналы
- canceled(EventPoint point)
- grabChanged(GrabTransition transition, EventPoint point)
Подробное описание
PointHandler может использоваться для отображения обратной связи о точке касания или позиции мыши, или для другой реакции на события указателя.
При возникновении события нажатия каждый экземпляр PointHandler выбирает единственную точку, которая еще не «захвачена» в этот момент: если нажатие происходит в пределах границ PointerHandler::parent, и ни один брат PointHandler в том же PointerHandler::parent еще не получил пассивный захват этой точки, и если выполняются другие ограничения, такие как acceptedButtons, acceptedDevices и т. д., то он подходит, и PointHandler затем получает пассивный захват. Таким образом, PointerHandler::parent действует как эксклюзивная группа: может быть несколько экземпляров PointHandler, и набор нажатых точек касания будет распределен между ними. Каждый PointHandler, который выбрал точку для отслеживания, имеет свойство active true. Затем он продолжает отслеживать выбранную точку до отпускания: свойства point будут обновляться. Любой элемент может привязаться к этим свойствам и, таким образом, следить за перемещением точки.
Благодаря тому, что это только пассивный захватыватель, у него есть возможность сохранять независимый надзор за всеми перемещениями. Пассивный захват нельзя украсть или переопределить даже при обнаружении других жестов и возникновении эксклюзивных захватов.
Если ваша цель — ортогональный контроль за точками событий, более старой альтернативой был QObject::installEventFilter(), но это никогда не было встроенной функцией QtQuick: это требует некоторого кода на C++, такого как подкласс QQuickItem. PointHandler более эффективен, чем это, поскольку только события указателя будут передаваться ему в ходе обычной передачи событий в QQuickWindow; тогда как фильтру события нужно отфильтровать все QEvents всех типов, и таким образом, он сам становится потенциальной узкой точкой передачи событий.
Возможный случай использования — добавление этого обработчика в прозрачный элемент, который находится поверх остальной части сцены (имея высокое значение z), поэтому, когда точка только что нажата, она будет передана в этот элемент и его обработчики в первую очередь, предоставляя возможность получить пассивный захват как можно раньше. Такой элемент (например, стекло над всем пользовательским интерфейсом) может быть удобным родителем для других элементов, которые визуализируют вид обратной связи, которая всегда должна быть сверху; и аналогично он может быть родителем всплывающих окон, всплывающих подсказок, диалогов и так далее. Если он будет использоваться таким образом, для вашего main.cpp может быть полезно использовать QQmlContext::setContextProperty(), чтобы сделать «стеклянную панель» доступной по идентификатору для всего пользовательского интерфейса, чтобы другие элементы и PointHandlers могли быть переродителями к ней.
import QtQuick 2.12
import QtQuick.Window 2.2
Window {
width: 480
height: 320
visible: true
Item {
id: glassPane
z: 10000
anchors.fill: parent
PointHandler {
id: handler
acceptedDevices: PointerDevice.TouchScreen | PointerDevice.TouchPad
target: Rectangle {
parent: glassPane
color: "red"
visible: handler.active
x: handler.point.position.x - width / 2
y: handler.point.position.y - height / 2
width: 20; height: width; radius: width / 2
}
}
}
} Как и все обработчики ввода, у PointHandler есть свойство target, которое может использоваться в качестве удобного места для размещения элемента отслеживания точки; но PointHandler не будет автоматически манипулировать элементом target каким-либо образом. Вам нужно использовать привязки, чтобы заставить его реагировать на point.
Примечание: В macOS PointHandler по умолчанию не реагирует на трекпад. Это связано с тем, что macOS может предоставить либо собственное распознавание жестов, либо сырые точки касания, но не оба. Мы предпочитаем использовать событие жеста в PinchHandler, поэтому не хотим его отключать, включив касание. Однако MultiPointTouchArea включает касание, тем самым отключая распознавание собственных жестов во всем окне; поэтому это альтернатива, если вы хотите реагировать только на все точки касания, но не нуждаетесь в плавном опыте распознавания жестов.
См. также MultiPointTouchArea.
Документация свойств
acceptedButtons : flags
Кнопки мыши, которые могут активировать этот обработчик указателя.
По умолчанию это свойство установлено в Qt.LeftButton. Его можно установить в сочетание кнопок мыши, и он будет игнорировать события от других кнопок.
Например, элемент управления можно сделать так, чтобы он реагировал на левые и правые щелчки по-разному, используя два обработчика:
Item {
TapHandler {
onTapped: console.log("left clicked")
}
TapHandler {
acceptedButtons: Qt.RightButton
onTapped: console.log("right clicked")
}
} Примечание: Нажатие на сенсорном экране или нажатие стилуса на графическом планшете имитирует нажатие левой кнопки мыши. Это поведение можно изменить с помощью acceptedDevices или acceptedPointerTypes.
acceptedDevices : flags
Типы указательных устройств, которые могут активировать этот обработчик указателя.
По умолчанию это свойство установлено в PointerDevice.AllDevices. Если вы установите его в OR-сочетание типов устройств, он будет игнорировать события от несоответствующих устройств.
Например, элемент управления можно сделать так, чтобы он реагировал на щелчки мышью и стилусом одним способом, а на касания на сенсорном экране — другим способом, используя два обработчика:
Item {
TapHandler {
acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus
onTapped: console.log("clicked")
}
TapHandler {
acceptedDevices: PointerDevice.TouchScreen
onTapped: console.log("tapped")
}
} acceptedModifiers : flags
Если это свойство установлено, оно потребует нажатия заданных модификаторов клавиатуры, чтобы отреагировать на события указателя, и в противном случае игнорирует их.
Если это свойство установлено в Qt.KeyboardModifierMask (значение по умолчанию), то PointerHandler игнорирует клавиши модификаторов.
Например, элемент Item может иметь два обработчика одного типа, один из которых активируется только при нажатии необходимых клавиш модификаторов:
Item {
TapHandler {
acceptedModifiers: Qt.ControlModifier
onTapped: console.log("control-tapped")
}
TapHandler {
acceptedModifiers: Qt.NoModifier
onTapped: console.log("tapped")
}
} Если вы устанавливаете acceptedModifiers в OR-сочетание клавиш модификаторов, это означает, что все эти модификаторы должны быть нажаты для активации обработчика:
Item {
TapHandler {
acceptedModifiers: Qt.ControlModifier | Qt.AltModifier | Qt.ShiftModifier
onTapped: console.log("control-alt-shift-tapped")
}
} Доступные модификаторы:
| Постоянная | Описание |
|---|---|
NoModifier |
Ни одна клавиша модификатора не разрешена. |
ShiftModifier |
Должна быть нажата клавиша Shift на клавиатуре. |
ControlModifier |
Должна быть нажата клавиша Ctrl на клавиатуре. |
AltModifier |
Должна быть нажата клавиша Alt на клавиатуре. |
MetaModifier |
Должна быть нажата клавиша Meta на клавиатуре. |
KeypadModifier |
Должна быть нажата кнопка цифрового блока. |
GroupSwitchModifier |
Только X11 (если не активировано в Windows командной строкой). Должна быть нажата клавиша переключения режимов на клавиатуре. |
KeyboardModifierMask |
Обработчик не заботится о том, какие модификаторы нажаты. |
Если вам нужно более сложное поведение, чем можно добиться с помощью комбинаций нескольких обработчиков с несколькими флагами модификаторов, вы можете проверить модификаторы в коде JavaScript:
Item {
TapHandler {
onTapped:
switch (point.modifiers) {
case Qt.ControlModifier | Qt.AltModifier:
console.log("CTRL+ALT");
break;
case Qt.ControlModifier | Qt.AltModifier | Qt.MetaModifier:
console.log("CTRL+META+ALT");
break;
default:
console.log("other modifiers", point.modifiers);
break;
}
}
} См. также Qt::KeyboardModifier.
acceptedPointerTypes : flags
Типы указательных инструментов (палец, стилус, ластик и т. д.), которые могут активировать этот обработчик указателя.
По умолчанию это свойство установлено в PointerDevice.AllPointerTypes. Если вы установите его в OR-сочетание типов устройств, он будет игнорировать события от несоответствующих событий.
Например, элемент управления можно сделать так, чтобы он реагировал на щелчки мышью, касанием и стилусом каким-то образом, но удалял себя, если на него нажали ластиком на графическом планшете, с двумя обработчиками:
Rectangle {
id: rect
TapHandler {
acceptedPointerTypes: PointerDevice.GenericPointer | PointerDevice.Finger | PointerDevice.Pen
onTapped: console.log("clicked")
}
TapHandler {
acceptedPointerTypes: PointerDevice.Eraser
onTapped: rect.destroy()
}
} [только для чтения] active : bool
Это справедливо всякий раз, когда этот обработчик ввода взял на себя полную ответственность за обработку одного или нескольких EventPoints, успешно захватив эти точки. Это означает, что он сохраняет свои свойства актуальными в соответствии с перемещениями этих точек событий и активно манипулирует своим target (если таковой имеется).
cursorShape : Qt::CursorShape
Это свойство содержит форму курсора, которая будет отображаться всякий раз, когда указатель мыши находится над родительским элементом, в то время как свойство active равно true.
Доступные формы курсора:
- Qt.ArrowCursor
- Qt.UpArrowCursor
- Qt.CrossCursor
- Qt.WaitCursor
- Qt.IBeamCursor
- Qt.SizeVerCursor
- Qt.SizeHorCursor
- Qt.SizeBDiagCursor
- Qt.SizeFDiagCursor
- Qt.SizeAllCursor
- Qt.BlankCursor
- Qt.SplitVCursor
- Qt.SplitHCursor
- Qt.PointingHandCursor
- Qt.ForbiddenCursor
- Qt.WhatsThisCursor
- Qt.BusyCursor
- Qt.OpenHandCursor
- Qt.ClosedHandCursor
- Qt.DragCopyCursor
- Qt.DragMoveCursor
- Qt.DragLinkCursor
Значение по умолчанию не задано, что позволяет отобразить курсор cursor родительского элемента. Это свойство можно сбросить до первоначального состояния, установив его в undefined.
Примечание: Если это свойство не задано или установлено в undefined, при чтении значения оно вернёт Qt.ArrowCursor.
Это свойство было добавлено в Qt 5.15.
См. также Qt::CursorShape, QQuickItem::cursor() и HoverHandler::cursorShape.
dragThreshold : int
Расстояние в пикселях, которое пользователь должен переместить точку события, чтобы оно считалось жестом перетаскивания.
Значение по умолчанию зависит от платформы и разрешения экрана. Его можно сбросить до значения по умолчанию, установив его в undefined. Поведение при начале жеста перетаскивания отличается в разных обработчиках.
Это свойство было добавлено в Qt 5.15.
enabled : bool
Если обработчик PointerHandler отключен, он будет отклонять все события, и никакие сигналы не будут выпущены.
grabPermissions : flags
Это свойство определяет разрешения, когда логика этого обработчика принимает эксклюзивный захват или когда его просят одобрить захват или отмену захвата другим обработчиком.
| Постоянная | Описание |
|---|---|
PointerHandler.TakeOverForbidden |
Этот обработчик не получает и не предоставляет разрешения на захват для любого типа элемента или обработчика. |
PointerHandler.CanTakeOverFromHandlersOfSameType |
Этот обработчик может захватить эксклюзивное управление у другого обработчика того же класса. |
PointerHandler.CanTakeOverFromHandlersOfDifferentType |
Этот обработчик может захватить эксклюзивное управление у любого обработчика. |
PointerHandler.CanTakeOverFromAnything |
Этот обработчик может захватить эксклюзивное управление у любого типа элемента или обработчика. |
PointerHandler.ApprovesTakeOverByHandlersOfSameType |
Этот обработчик разрешает другому обработчику того же класса захватить управление. |
PointerHandler.ApprovesTakeOverByHandlersOfDifferentType |
Этот обработчик разрешает любому обработчику захватить управление. |
PointerHandler.ApprovesTakeOverByItems |
Этот обработчик разрешает любому элементу захватить управление. |
PointerHandler.ApprovesCancellation |
Этот обработчик позволит установить захват в null. |
PointerHandler.ApprovesTakeOverByAnything |
Этот обработчик предоставляет разрешение любому типу элемента или обработчика захватить управление. |
Значение по умолчанию — PointerHandler.CanTakeOverFromItems | PointerHandler.CanTakeOverFromHandlersOfDifferentType | PointerHandler.ApprovesTakeOverByAnything, что допускает большинство сценариев захвата, но избегает, например, конфликтов между двумя PinchHandlers за те же точки касания.
margin : real
Отступ за пределами границ элемента parent, внутри которого точка события может активировать этот обработчик. Например, в PinchHandler, где target также является parent, полезно установить это значение на расстояние, по крайней мере, вдвое превышающее ширину типичной человеческой руки. Это пригодится, если parent было уменьшено до очень маленького размера, чтобы жест Pinch был все ещё возможен. Или, если кнопка на основе TapHandler расположена возле края экрана, это можно использовать для соблюдения Закона Фиттса: реагировать на щелчки мышью на краю экрана, даже если кнопка визуально расположена на расстоянии нескольких пикселей от края.
Значение по умолчанию — 0.
[read-only] parent : Item
Элемент Item, который является областью действия обработчика; элемент, в котором он был объявлен. Обработчик будет обрабатывать события от имени этого элемента, что означает, что событие указателя является релевантным, если хотя бы одна из его точек событий находится внутри внутренности элемента. Изначально target() такой же, но его можно переназначить.
См. также target и QObject::parent().
[read-only] point : HandlerPoint
Точка события, которая в данный момент обрабатывается. Когда никакая точка не обрабатывается, этот объект сбрасывается до значения по умолчанию (все координаты равны 0).
target : Item
Элемент Item, которым будет манипулировать этот обработчик.
По умолчанию он совпадает с parent, элементом, внутри которого объявлен обработчик. Однако иногда бывает полезно установить target на другой элемент, чтобы обрабатывать события в одном элементе, но манипулировать другим; или null, чтобы отключить стандартное поведение и сделать что-то другое вместо этого.
Документация сигналов
canceled(EventPoint point)
Если этот обработчик уже захватил указанную точку point, этот сигнал испускается, когда захват похищен другим обработчиком указателя или элементом.
Примечание: Соответствующий обработчик — onCanceled.
grabChanged(GrabTransition transition, EventPoint point)
Этот сигнал испускается, когда захват каким-либо образом изменился, что имеет отношение к этому обработчику.
transition (глагол) показывает, что произошло. point (объект) — это точка, которая была захвачена или освобождена.
Примечание: Соответствующий обработчик — onGrabChanged.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qml-qtquick-pointhandler.html