Тип QML PointHandler
Обработчик для реагирования на одну точку касания. Подробнее...
| Заявление об импорте: | import QtQuick 2.13 |
| Наследуется от: |
Свойства
- acceptedButtons : флаги
- acceptedDevices : флаги
- acceptedModifiers : флаги
- acceptedPointerTypes : флаги
- active : bool
- enabled : bool
- grabPermissions : флаги
- margin : вещественное число
- 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; тогда как фильтру события необходимо отфильтровать все QEvent всех типов, и поэтому он устанавливает себя в качестве потенциальной узкой точки доставки событий.
Один из возможных вариантов использования — добавить этот обработчик в прозрачный Item, который находится поверх остальной сцены (имея высокое значение z), так что при новом нажатии на точку она будет сначала доставлена этому Item и его обработчикам, что даст возможность захватить пассивную блокировку как можно раньше. Такой элемент (например, стекло над всем пользовательским интерфейсом) может быть удобным родителем для других Item, которые визуализируют тот тип реактивной обратной связи, которая всегда должна быть сверху; аналогичным образом он может быть родителем всплывающих окон, всплывающих окон, диалоговых окон и т. д. Если он будет использоваться таким образом, для вашей main.cpp может быть полезно использовать QQmlContext::setContextProperty(), чтобы сделать «стеклянную панель» доступной по идентификатору для всего пользовательского интерфейса, чтобы другие Items и PointHandler могли быть переродителями к нему.
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 : флаги
Кнопки мыши, которые могут активировать этот обработчик указателя.
По умолчанию это свойство установлено в Qt.LeftButton. Оно может быть установлено в комбинацию кнопок мыши с помощью оператора ИЛИ и проигнорирует события от других кнопок.
Например, управление может быть настроено на реагирование на щелчки левой и правой кнопок по-разному, с помощью двух обработчиков:
Item {
TapHandler {
onTapped: console.log("left clicked")
}
TapHandler {
acceptedButtons: Qt.RightButton
onTapped: console.log("right clicked")
}
} Примечание: Нажатие на сенсорный экран или нажатие стилуса на графическом планшете имитирует нажатие левой кнопки мыши. Это поведение можно изменить с помощью acceptedDevices или acceptedPointerTypes.
acceptedDevices : флаги
Типы указывающих устройств, которые могут активировать этот обработчик указателя.
По умолчанию это свойство установлено в PointerDevice.AllDevices. Если вы устанавливаете комбинацию типов устройств с помощью оператора ИЛИ, события от устройств, не соответствующих типу, будут проигнорированы.
Например, управление может быть настроено на реагирование на щелчки мышью и стилусом одним способом, а на касания на сенсорном экране другим способом, с помощью двух обработчиков:
Item {
TapHandler {
acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus
onTapped: console.log("clicked")
}
TapHandler {
acceptedDevices: PointerDevice.TouchScreen
onTapped: console.log("tapped")
}
} acceptedModifiers : флаги
Если это свойство установлено, для реагирования на события указателя потребуются нажатые заданные модификаторы клавиатуры, в противном случае они будут проигнорированы.
Если это свойство установлено в Qt.KeyboardModifierMask (значение по умолчанию), то PointerHandler игнорирует клавиши модификаторов.
Например, у Item могут быть два обработчика одного типа, один из которых активируется только при нажатии необходимых клавиш модификаторов:
Item {
TapHandler {
acceptedModifiers: Qt.ControlModifier
onTapped: console.log("control-tapped")
}
TapHandler {
acceptedModifiers: Qt.NoModifier
onTapped: console.log("tapped")
}
} acceptedPointerTypes : флаги
Типы указывающих инструментов (палец, стилус, ластик и т. д.), которые могут активировать этот обработчик указателя.
По умолчанию это свойство установлено в 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, успешно захватив эксклюзивный захват этих точек. Это означает, что он поддерживает актуальность своих свойств в соответствии с перемещениями этих Event Points и активно манипулирует своим target (если таковой имеется).
enabled : bool
Если PointerHandler отключен, он будет отклонять все события, и никакие сигналы не будут отправлены.
grabPermissions : флаги
Это свойство определяет разрешения при принятии обработчиком логики по захвату эксклюзивного захвата или при запросе на одобрение захвата или отмены захвата другим обработчиком.
| Постоянная | Описание |
|---|---|
PointerHandler.TakeOverForbidden |
Этот обработчик не забирает и не предоставляет разрешение на захват для любого типа элемента или обработчика. |
PointerHandler.CanTakeOverFromHandlersOfSameType |
Этот обработчик может забрать эксклюзивный захват от другого обработчика того же класса. |
PointerHandler.CanTakeOverFromHandlersOfDifferentType |
Этот обработчик может забрать эксклюзивный захват от любого типа обработчика. |
PointerHandler.CanTakeOverFromAnything |
Этот обработчик может забрать эксклюзивный захват от любого типа элемента или обработчика. |
PointerHandler.ApprovesTakeOverByHandlersOfSameType |
Этот обработчик предоставляет разрешение другому обработчику того же класса забрать захват. |
PointerHandler.ApprovesTakeOverByHandlersOfDifferentType |
Этот обработчик предоставляет разрешение любому типу обработчика забрать захват. |
PointerHandler.ApprovesTakeOverByItems |
Этот обработчик предоставляет разрешение любому элементу типа Item забрать захват. |
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, элемент, в котором объявлен обработчик. Однако иногда бывает полезно установить целевой элемент на другой элемент, чтобы обрабатывать события внутри одного элемента, но манипулировать другим; или чтобы 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.13/qml-qtquick-pointhandler.html