PointHandler QML Type

Handler für die Reaktion auf einen einzelnen Touchpoint. Mehr...

Import Statement: import QtQuick
Inherits:

SinglePointHandler

Eigenschaften

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

KonstanteBeschreibung
NoModifierKeine Modifikatortaste ist erlaubt.
ShiftModifierEs muss eine Umschalttaste auf der Tastatur gedrückt werden.
ControlModifierEine Strg-Taste auf der Tastatur muss gedrückt sein.
AltModifierEine Alt-Taste auf der Tastatur muss gedrückt sein.
MetaModifierEine Meta-Taste auf der Tastatur muss gedrückt sein.
KeypadModifierEine Taste der Tastatur muss gedrückt sein.
GroupSwitchModifierNur X11 (sofern nicht unter Windows durch ein Befehlszeilenargument aktiviert). Eine Mode_switch-Taste auf der Tastatur muss gedrückt sein.
KeyboardModifierMaskDem 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 [read-only]

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.

KonstanteBeschreibung
PointerHandler.TakeOverForbiddenDieser Handler nimmt keinem Item- oder Handler-Typ die Grab-Erlaubnis weg und gibt sie auch nicht weiter.
PointerHandler.CanTakeOverFromHandlersOfSameTypeDieser Handler kann den exklusiven Zugriff von einem anderen Handler der gleichen Klasse übernehmen.
PointerHandler.CanTakeOverFromHandlersOfDifferentTypeDieser Handler kann den exklusiven Zugriff von jeder Art von Handler annehmen.
PointerHandler.CanTakeOverFromItemsDieser Handler kann den exklusiven Zugriff von jeder Art von Item annehmen.
PointerHandler.CanTakeOverFromAnythingDieser Handler kann den exklusiven Zugriff von jeder Art von Item oder Handler annehmen.
PointerHandler.ApprovesTakeOverByHandlersOfSameTypeDieser Handler gibt einem anderen Handler der gleichen Klasse die Erlaubnis, den Griff zu übernehmen.
PointerHandler.ApprovesTakeOverByHandlersOfDifferentTypeDieser Handler gibt jeder Art von Handler die Erlaubnis, den Greifer zu nehmen.
PointerHandler.ApprovesTakeOverByItemsDieser Handler gibt jeder Art von Gegenstand die Erlaubnis, den Greifer zu nehmen.
PointerHandler.ApprovesCancellationDieser Handler erlaubt, dass sein Grab auf Null gesetzt wird.
PointerHandler.ApprovesTakeOverByAnythingDieser 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 [read-only]

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:

KonstanteBeschreibung
PointerDevice.GrabExclusiveDieser Handler hat die Hauptverantwortung für die Bearbeitung des point übernommen.
PointerDevice.UngrabExclusiveDieser Handler hat sein bisheriges exklusives Greifen aufgegeben.
PointerDevice.CancelGrabExclusiveDer exklusive Zugriff dieses Handlers wurde übernommen oder aufgehoben.
PointerDevice.GrabPassiveDieser Handler hat einen passiven Zugriff erworben, um die point zu überwachen.
PointerDevice.UngrabPassiveDieser Handler hat seinen bisherigen passiven Zugriff aufgegeben.
PointerDevice.CancelGrabPassiveDer 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.