Тип QML PointHandler
Обработчик для реакции на одну точку касания. Подробнее...
| Оператор импорта: | import QtQuick 2.14 |
| Наследуется от: |
Свойства
- acceptedButtons : flags
- acceptedDevices : flags
- acceptedModifiers : flags
- acceptedPointerTypes : flags
- active : bool
- enabled : bool
- grabPermissions : flags
- margin : real
- parent : Item
- point : HandlerPoint
- target : Item
Сигналы
- canceled(point)
- grabChanged(transition, EventPoint point)
Подробное описание
PointHandler может использоваться для отображения обратной связи о точке касания или позиции указателя мыши или для иной реакции на события указателя.
При возникновении события нажатия каждый экземпляр PointHandler выбирает одну точку, которая еще не «занята» в этот момент: если нажатие происходит в пределах границ PointerHandler::parent, и ни один другой PointHandler в том же PointerHandler::parent еще не захватил пассивный захват этой точки, и если выполняются другие ограничения, такие как acceptedButtons, acceptedDevices и т. д., то он подходит, и PointHandler затем получает пассивный захват. Таким образом, PointerHandler::parent действует как эксклюзивная группа: может быть несколько экземпляров PointHandler, и набор нажатых точек касания будет распределен между ними. Каждый PointHandler, который выбрал точку для отслеживания, имеет свойство active true. Затем он продолжает отслеживать выбранную точку до отпускания: свойства point будут обновляться. Любой Item может привязаться к этим свойствам и, таким образом, следить за перемещениями точки.
Будучи только пассивным захватывателем, он обладает возможностью сохранять независимый контроль над всеми перемещениями. Пассивный захват не может быть украден или перекрыт даже при обнаружении других жестов и возникновении эксклюзивных захватов.
Если вашей целью является ортогональное наблюдение за точками событий, старой альтернативой был QObject::installEventFilter(), но это никогда не было встроенной функцией QtQuick: для этого требуется код C++, такой как подкласс QQuickItem. PointHandler более эффективен, поскольку только события указателя будут передаваться ему в процессе нормальной передачи событий в QQuickWindow; в то время как фильтру событий нужно отфильтровать все QEvents всех типов, и тем самым он становится потенциальной узкой точкой передачи событий.
Одно из возможных применений — добавить этот обработчик в прозрачный Item, который находится поверх остальной части сцены (имея высокое значение z), чтобы, когда точка только что нажата, она была передана этому Item и его обработчикам в первую очередь, предоставив возможность получить пассивный захват как можно раньше. Такой элемент (например, панель стекла над всем пользовательским интерфейсом) может быть удобным родителем для других элементов, которые визуализируют вид обратной связи, которая должна всегда быть сверху; аналогично, он может быть родителем для всплывающих окон, всплывающих подсказок, диалогов и т. д. Если он будет использоваться таким образом, для вашей main.cpp может быть полезно использовать QQmlContext::setContextProperty(), чтобы сделать «панель стекла» доступной по идентификатору всему пользовательскому интерфейсу, чтобы другие Item и 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, которое может быть использовано в качестве удобного места для размещения элемента Item, отслеживающего точку; но 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. Если вы установите его в комбинацию типов устройств с операцией ИЛИ, то он будет игнорировать события от устройств, не соответствующих типу.
Например, управление может быть настроено на реагирование на щелчки мыши и стилуса одним способом, а на касания на сенсорном экране другим способом, с двумя обработчиками:
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 в комбинацию клавиш модификаторов с операцией ИЛИ, это означает, что для активации обработчика должны быть нажаты все эти модификаторы:
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. Если вы установите его в комбинацию типов устройств с операцией ИЛИ, то он будет игнорировать события от устройств, не соответствующих типу.
Например, управление можно настроить на реагирование на щелчки мышью, касанием и стилусом каким-то образом, но удалить себя, если его коснуться ластиком на графическом планшете, с двумя обработчиками:
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, успешно получив эксклюзивный захват этих точек. Это означает, что он поддерживает актуальность своих свойств в соответствии с перемещениями этих EventPoints и активно управляет своим target (если таковой имеется).
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 , что позволяет большинству сценариев захвата, но избегает, например, ситуации, когда два PinchHandler'а борются за одни и те же точки касания.
margin : real
Отступ за пределами границ элемента родителя, в котором точка события может активировать этот обработчик. Например, в PinchHandler, где target также является parent, полезно установить это значение как расстояние, по крайней мере, в половину ширины типичного пальца пользователя, чтобы при уменьшении размера parent возможность использования жеста pinch оставалась. Или, если кнопка на основе TapHandler расположена близко к краю экрана, её можно использовать для соответствия закону Фиттса: реагировать на щелчки мыши на краю экрана, даже если кнопка визуально смещена от края на несколько пикселей.
Значение по умолчанию равно 0.
[только для чтения] parent : Item
Элемент (Item), являющийся областью действия обработчика; Элемент, в котором он был объявлен. Обработчик будет обрабатывать события от имени этого Элемента, что означает, что событие касания актуально, если хотя бы одна из его точек события находится внутри внутренней области Элемента. Изначально target() совпадает, но его можно переназначить.
См. также target и QObject::parent().
[только для чтения] point : HandlerPoint
Точка события, которая в настоящее время обрабатывается. Когда точка не обрабатывается, этот объект сбрасывается до значений по умолчанию (все координаты равны 0).
target : Item
Элемент (Item), который будет изменять этот обработчик.
По умолчанию он совпадает с parent, Элементом, в котором объявлен обработчик. Однако иногда бывает полезно установить target на другой Элемент, чтобы обрабатывать события внутри одного элемента, но изменять другой; или чтобы null, чтобы отключить стандартное поведение и сделать что-то другое вместо этого.
Документация сигналов
canceled(point)
Если этот обработчик уже захватил заданную point, этот сигнал излучается, когда захват отбирается другим обработчиком касаний или Элементом.
grabChanged(transition, EventPoint point)
Этот сигнал излучается, когда захват изменяется каким-либо образом, что актуально для этого обработчика.
transition (глагол) показывает, что произошло. point (объект) — это точка, которая была захвачена или освобождена.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qml-qtquick-pointhandler.html