PointHandler QML Type
Handler für die Reaktion auf einen einzelnen Touchpoint. Mehr...
Import Statement: | import QtQuick |
Inherits: |
Eigenschaften
- acceptedButtons : flags
- acceptedDevices : flags
- acceptedModifiers : flags
- acceptedPointerTypes : flags
- active : bool
- cursorShape : Qt::CursorShape
- enabled : bool
- grabPermissions : flags
- margin : real
- parent : Item
- point : handlerPoint
- target : real
Signale
- canceled(eventPoint point)
- grabChanged(PointerDevice::GrabTransition transition, eventPoint point)
Detaillierte Beschreibung
PointHandler kann verwendet werden, um eine Rückmeldung über einen Berührungspunkt oder die Mausposition zu geben oder um auf andere Weise auf Zeigerereignisse zu reagieren.
Wenn ein Druckereignis auftritt, wählt jede Instanz von PointHandler einen einzelnen Punkt aus, der zu diesem Zeitpunkt noch nicht "besetzt" ist: Wenn der Druck innerhalb der Grenzen von PointerHandler::parent auftritt und kein Geschwister-PointHandler innerhalb desselben PointerHandler::parent noch einen passiven Zugriff auf diesen Punkt erworben hat, und wenn die anderen Einschränkungen wie acceptedButtons, acceptedDevices usw. erfüllt sind, ist er wählbar, und der PointHandler erwirbt dann einen passiven Zugriff. Auf diese Weise verhält sich PointerHandler::parent wie eine exklusive Gruppe: es kann mehrere Instanzen von PointHandler geben, und die Menge der gedrückten Touchpoints wird unter ihnen verteilt. Jeder PointHandler, der einen Punkt zum Verfolgen ausgewählt hat, hat die Eigenschaft active true
. Er verfolgt dann seinen gewählten Punkt bis zur Freigabe: die Eigenschaften von point werden auf dem neuesten Stand gehalten. Jedes Element kann sich an diese Eigenschaften binden und so die Bewegungen des Punktes verfolgen.
Da es sich nur um einen passiven Greifer handelt, hat er die Möglichkeit, alle Bewegungen unabhängig zu überwachen. Der passive Greifer kann nicht gestohlen oder außer Kraft gesetzt werden, selbst wenn andere Gesten erkannt werden und exklusive Greifer auftreten.
Wenn Ihr Ziel die orthogonale Überwachung von Ereignispunkten ist, war eine ältere Alternative QObject::installEventFilter(), aber das war nie ein eingebautes QtQuick Feature: es erfordert etwas C++ Code, wie eine QQuickItem Unterklasse. PointHandler ist effizienter als das, weil nur Zeiger-Ereignisse an ihn geliefert werden, während der normalen Ereignislieferung in QQuickWindow; wohingegen ein Ereignisfilter alle QEvents aller Typen filtern muss und sich somit als potentieller Engpass für die Ereignislieferung etabliert.
Ein möglicher Anwendungsfall ist das Hinzufügen dieses Handlers zu einem transparenten Element, das sich über dem Rest der Szene befindet (durch einen hohen z Wert), so dass ein frisch gedrückter Punkt zuerst an dieses Element und seine Handler geliefert wird, was die Möglichkeit bietet, den passiven Grab so früh wie möglich zu nehmen. Ein solches Element (wie eine Glasscheibe über der gesamten Benutzeroberfläche) kann ein bequemes Elternteil für andere Elemente sein, die die Art von reaktivem Feedback visualisieren, das immer oben sein muss; und ebenso kann es das Elternteil für Popups, Popovers, Dialoge und so weiter sein. Wenn es auf diese Weise verwendet wird, kann es für Ihre main.cpp hilfreich sein, QQmlContext::setContextProperty() zu verwenden, um die "Glasscheibe" per ID für die gesamte Benutzeroberfläche zugänglich zu machen, so dass andere Items und PointHandler auf sie repariert werden können.
import QtQuick 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 } } } }
Wie alle Input-Handler hat ein PointHandler eine target Eigenschaft, die als bequemer Platz für ein Point-Tracking Item verwendet werden kann; aber PointHandler wird das target
Item nicht automatisch in irgendeiner Weise manipulieren. Sie müssen Bindungen verwenden, damit er auf das point reagiert.
Hinweis: Unter macOS reagiert PointHandler standardmäßig nicht auf mehrere Finger auf dem Trackpad, obwohl er auf einen gedrückten Punkt (Mausposition) reagiert. Das liegt daran, dass macOS entweder native Gestenerkennung oder rohe Berührungspunkte anbieten kann, aber nicht beides. Wir ziehen es vor, das native Gestenereignis in PinchHandler zu verwenden, daher wollen wir es nicht durch die Aktivierung von Touch deaktivieren. MultiPointTouchArea aktiviert jedoch die Berührung und deaktiviert damit die native Gestenerkennung im gesamten Fenster; es ist also eine Alternative, wenn Sie nur auf alle Berührungspunkte reagieren wollen, aber nicht die reibungslose native Gestenerfahrung benötigen.
Siehe auch MultiPointTouchArea, HoverHandler, und Qt Quick Beispiele - Pointer Handlers.
Dokumentation der Eigenschaft
acceptedButtons : flags |
Die Maustasten, die diese PointHandler aktivieren können.
Standardmäßig ist diese Eigenschaft auf Qt.LeftButton festgelegt. Sie kann auf eine ODER-Kombination von Maustasten festgelegt werden und ignoriert Ereignisse, bei denen andere Tasten gedrückt oder gehalten werden. Wenn sie auf Qt.NoButton
gesetzt ist, bedeutet dies, dass sie sich überhaupt nicht um Tasten kümmert und synthetische Mausereignisse ignoriert, die von einem Gerät kommen, für das sie bereits ein authentisches eventPoint verarbeitet.
import QtQuick Item { width: 480; height: 320 Rectangle { color: handler.active ? "tomato" : "wheat" x: handler.point.position.x - width / 2 y: handler.point.position.y - height / 2 width: 20; height: width; radius: width / 2 } PointHandler { id: handler acceptedButtons: Qt.MiddleButton | Qt.RightButton } }
Hinweis: Auf einem Touchscreen gibt es keine Tasten, so dass diese Eigenschaft PointHandler nicht daran hindert, auf Berührungspunkte zu reagieren.
Hinweis: Wenn diese Eigenschaft den Wert Qt.LeftButton
hat, ist es standardmäßig erlaubt, dass eine Nicht-Maus PointerDevice (z. B. ein Touchscreen oder ein Grafiktablett-Stift) synthetische Mausereignisse erzeugt. Diese zeigen normalerweise an, dass die linke Maustaste gedrückt ist, und diese Ereignisse können PointHandler vorübergehend deaktivieren, das bereits auf eine authentische eventPoint von dem Gerät reagiert hat. Es ist sinnvoll, die Funktion
acceptedButtons: \c Qt.NoButton
zu deklarieren, um dieses Problem zu vermeiden. Siehe auch Qt::AA_SynthesizeMouseForUnhandledTouchEvents und Qt::AA_SynthesizeMouseForUnhandledTabletEvents.
acceptedDevices : flags |
Die Typen von Zeigegeräten, die diese PointHandler aktivieren können.
Standardmäßig ist diese Eigenschaft auf PointerDevice.AllDevices gesetzt. Wenn Sie sie auf eine ODER-Kombination von Gerätetypen setzen, werden Ereignisse von nicht übereinstimmenden devices ignoriert:
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 } }
acceptedModifiers : flags |
Wenn diese Eigenschaft gesetzt ist, verlangt PointHandler, dass die angegebenen Tastaturmodifikatoren gedrückt werden, um auf PointerEvents zu reagieren, und ignoriert sie ansonsten.
Wenn diese Eigenschaft auf Qt.KeyboardModifierMask
gesetzt ist (der Standardwert), dann ignoriert PointHandler die Modifikatortasten.
Ein Item könnte zum Beispiel zwei Handler haben, von denen einer nur aktiviert wird, wenn der erforderliche Tastaturmodifikator gedrückt wird:
import QtQuick Item { id: feedbackPane width: 480; height: 320 PointHandler { id: control acceptedModifiers: Qt.ControlModifier cursorShape: Qt.PointingHandCursor target: Rectangle { parent: feedbackPane color: control.active ? "indianred" : "khaki" x: control.point.position.x - width / 2 y: control.point.position.y - height / 2 width: 20; height: width; radius: width / 2 } } PointHandler { id: shift acceptedModifiers: Qt.ShiftModifier | Qt.MetaModifier cursorShape: Qt.CrossCursor target: Rectangle { parent: feedbackPane color: shift.active ? "darkslateblue" : "lightseagreen" x: shift.point.position.x - width / 2 y: shift.point.position.y - height / 2 width: 30; height: width; radius: width / 2 } } }
Wenn Sie acceptedModifiers
auf eine ODER-Kombination von Modifikatortasten setzen, bedeutet dies, dass alle diese Modifikatoren gedrückt werden müssen, um den Handler zu aktivieren.
Die verfügbaren Modifikatoren sind wie folgt
Konstante | Beschreibung |
---|---|
NoModifier | Keine Modifikatortaste ist erlaubt. |
ShiftModifier | Es muss eine Umschalttaste auf der Tastatur gedrückt werden. |
ControlModifier | Eine Strg-Taste auf der Tastatur muss gedrückt sein. |
AltModifier | Eine Alt-Taste auf der Tastatur muss gedrückt sein. |
MetaModifier | Eine Meta-Taste auf der Tastatur muss gedrückt sein. |
KeypadModifier | Eine Taste der Tastatur muss gedrückt sein. |
GroupSwitchModifier | Nur X11 (sofern nicht unter Windows durch ein Befehlszeilenargument aktiviert). Eine Mode_switch-Taste auf der Tastatur muss gedrückt sein. |
KeyboardModifierMask | Dem Handler ist es egal, welche Modifikatoren gedrückt werden. |
Siehe auch Qt::KeyboardModifier.
acceptedPointerTypes : flags |
Die Arten von Zeigeinstrumenten (Finger, Stift, Radiergummi usw.), die diese PointHandler aktivieren können.
Standardmäßig ist diese Eigenschaft auf PointerDevice.AllPointerTypes gesetzt. Wenn Sie sie auf eine ODER-Kombination von Gerätetypen setzen, werden Ereignisse von nicht übereinstimmenden devices ignoriert:
import QtQuick Canvas { id: canvas width: 800 height: 600 antialiasing: true renderTarget: Canvas.FramebufferObject property var points: [] onPaint: { if (points.length < 2) return var ctx = canvas.getContext('2d'); ctx.save() ctx.strokeStyle = stylusHandler.active ? "blue" : "white" ctx.lineCap = "round" ctx.beginPath() ctx.moveTo(points[0].x, points[0].y) for (var i = 1; i < points.length; i++) ctx.lineTo(points[i].x, points[i].y) ctx.lineWidth = 3 ctx.stroke() points = points.slice(points.length - 2, 1) ctx.restore() } PointHandler { id: stylusHandler acceptedPointerTypes: PointerDevice.Pen onPointChanged: { canvas.points.push(point.position) canvas.requestPaint() } } PointHandler { id: eraserHandler acceptedPointerTypes: PointerDevice.Eraser onPointChanged: { canvas.points.push(point.position) canvas.requestPaint() } } Rectangle { width: 10; height: 10 color: stylusHandler.active ? "green" : eraserHandler.active ? "red" : "beige" } }
Die Qt Quick Beispiele - Pointer Handlers enthält ein komplexeres Beispiel für das Zeichnen auf einem Canvas mit einem Grafiktablett.
active : bool |
Dieses hält true
immer dann, wenn die Bedingungen erfüllt sind und dieses PointHandler reagiert. Das bedeutet, dass es seine Eigenschaften entsprechend den Bewegungen von eventPoints, die die Bedingungen erfüllen, auf dem neuesten Stand hält.
cursorShape : Qt::CursorShape |
Diese Eigenschaft enthält die Cursorform, die immer dann erscheint, wenn der Mauszeiger über dem Element parent schwebt, während active true
ist.
Die verfügbaren Cursorformen sind:
- 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
Der Standardwert ist nicht gesetzt, so dass das Element cursor von parent erscheinen kann. Diese Eigenschaft kann auf den gleichen Ausgangszustand zurückgesetzt werden, indem sie auf undefiniert gesetzt wird.
Hinweis: Wenn diese Eigenschaft nicht gesetzt ist oder auf undefined
gesetzt wurde, wird beim Auslesen des Wertes Qt.ArrowCursor
zurückgegeben.
Siehe auch Qt::CursorShape, QQuickItem::cursor(), und HoverHandler::cursorShape.
enabled : bool |
Wenn ein PointerHandler deaktiviert ist, werden alle Ereignisse abgelehnt und keine Signale ausgegeben.
grabPermissions : flags |
Diese Eigenschaft legt die Berechtigungen fest, wenn die Logik dieses Handlers beschließt, den exklusiven Greifer zu übernehmen, oder wenn er von einem anderen Handler aufgefordert wird, die Übernahme oder den Abbruch des Greifens zu genehmigen.
Konstante | Beschreibung |
---|---|
PointerHandler.TakeOverForbidden | Dieser Handler nimmt keinem Item- oder Handler-Typ die Grab-Erlaubnis weg und gibt sie auch nicht weiter. |
PointerHandler.CanTakeOverFromHandlersOfSameType | Dieser Handler kann den exklusiven Zugriff von einem anderen Handler der gleichen Klasse übernehmen. |
PointerHandler.CanTakeOverFromHandlersOfDifferentType | Dieser Handler kann den exklusiven Zugriff von jeder Art von Handler annehmen. |
PointerHandler.CanTakeOverFromItems | Dieser Handler kann den exklusiven Zugriff von jeder Art von Item annehmen. |
PointerHandler.CanTakeOverFromAnything | Dieser Handler kann den exklusiven Zugriff von jeder Art von Item oder Handler annehmen. |
PointerHandler.ApprovesTakeOverByHandlersOfSameType | Dieser Handler gibt einem anderen Handler der gleichen Klasse die Erlaubnis, den Griff zu übernehmen. |
PointerHandler.ApprovesTakeOverByHandlersOfDifferentType | Dieser Handler gibt jeder Art von Handler die Erlaubnis, den Greifer zu nehmen. |
PointerHandler.ApprovesTakeOverByItems | Dieser Handler gibt jeder Art von Gegenstand die Erlaubnis, den Greifer zu nehmen. |
PointerHandler.ApprovesCancellation | Dieser Handler erlaubt, dass sein Grab auf Null gesetzt wird. |
PointerHandler.ApprovesTakeOverByAnything | Dieser Handler erlaubt es jeder Art von Item oder Handler, den Grab zu übernehmen. |
Der Standardwert ist PointerHandler.CanTakeOverFromItems | PointerHandler.CanTakeOverFromHandlersOfDifferentType | PointerHandler.ApprovesTakeOverByAnything
, der die meisten Übernahmeszenarien zulässt, aber z. B. verhindert, dass sich zwei PinchHandler um dieselben Touchpoints streiten.
margin : real |
Die Spanne außerhalb der Grenzen des parent Elements, innerhalb derer ein eventPoint diesen Handler aktivieren kann.
Der Standardwert ist 0
.
import QtQuick Item { width: 480; height: 320 Rectangle { anchors.fill: handlingContainer anchors.margins: -handler.margin color: "beige" } Rectangle { id: handlingContainer width: 200; height: 200 anchors.centerIn: parent border.color: "green" color: handler.active ? "lightsteelblue" : "khaki" Text { text: "X" x: handler.point.position.x - width / 2 y: handler.point.position.y - height / 2 visible: handler.active } PointHandler { id: handler margin: 30 } } }
parent : Item |
Die Item, die der Anwendungsbereich des Handlers ist; das Element, in dem er deklariert wurde. Der Handler behandelt Ereignisse im Namen dieses Elements, was bedeutet, dass ein Zeiger-Ereignis relevant ist, wenn mindestens eines seiner eventPoints im Inneren des Elements auftritt. Ursprünglich ist target() derselbe, aber er kann neu zugewiesen werden.
Siehe auch target und QObject::parent().
point : handlerPoint |
Der eventPoint, der gerade bearbeitet wird. Wenn derzeit kein Punkt bearbeitet wird, wird dieses Objekt auf die Standardwerte zurückgesetzt (alle Koordinaten sind 0).
target : real |
Eine Eigenschaft, die bequem ein zu bearbeitendes Element enthalten oder eine Rückmeldung anzeigen kann. Im Gegensatz zu anderen Pointer-Handlern macht PointHandler nichts mit target
selbst: Sie müssen normalerweise reaktive Bindungen zu Eigenschaften wie SinglePointHandler::point und PointHandler::active erstellen. Wenn Sie hier eine Item-Instanz deklarieren, müssen Sie explizit deren parent setzen, da PointHandler kein Item ist.
Standardmäßig ist es dasselbe wie das parent, das Item, in dem der Handler deklariert ist.
Signal-Dokumentation
canceled(eventPoint point) |
Wenn dieser Handler das angegebene point bereits gegrabbt hat, wird dieses Signal ausgegeben, wenn das Grab von einem anderen Pointer-Handler oder Item gestohlen wird.
Hinweis: Der entsprechende Handler ist onCanceled
.
grabChanged(PointerDevice::GrabTransition transition, eventPoint point) |
Dieses Signal wird ausgegeben, wenn sich der Grab in irgendeiner Weise geändert hat, die für diesen Handler relevant ist.
Das transition (Verb) sagt, was passiert ist. Das point (Objekt) ist der Punkt, der gegriffen oder nicht gegriffen wurde.
Gültige Werte für transition sind:
Konstante | Beschreibung |
---|---|
PointerDevice.GrabExclusive | Dieser Handler hat die Hauptverantwortung für die Bearbeitung des point übernommen. |
PointerDevice.UngrabExclusive | Dieser Handler hat sein bisheriges exklusives Greifen aufgegeben. |
PointerDevice.CancelGrabExclusive | Der exklusive Zugriff dieses Handlers wurde übernommen oder aufgehoben. |
PointerDevice.GrabPassive | Dieser Handler hat einen passiven Zugriff erworben, um die point zu überwachen. |
PointerDevice.UngrabPassive | Dieser Handler hat seinen bisherigen passiven Zugriff aufgegeben. |
PointerDevice.CancelGrabPassive | Der vorherige passive Zugriff dieses Handlers wurde abnormal beendet. |
Hinweis: Der entsprechende Handler ist onGrabChanged
.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.