En esta página

PointHandler QML Type

Manejador para reaccionar a un único punto de contacto. Más...

Import Statement: import QtQuick
Inherits:

SinglePointHandler

Propiedades

Señales

  • canceled(eventPoint point)
  • grabChanged(PointerDevice::GrabTransition transition, eventPoint point)

Descripción detallada

PointHandler se puede utilizar para mostrar información sobre un punto de contacto o la posición del ratón, o para reaccionar de otra manera a los eventos del puntero.

Cuando se produce un evento de pulsación, cada instancia de PointHandler elige un único punto que aún no está "tomado" en ese momento: si la pulsación se produce dentro de los límites de PointerHandler::parent, y ningún PointHandler hermano dentro del mismo PointerHandler::parent ha adquirido aún un agarre pasivo en ese punto, y si se cumplen las demás restricciones como acceptedButtons, acceptedDevices etc., es elegible, y el PointHandler adquiere entonces un agarre pasivo. De este modo, PointerHandler::parent actúa como un grupo exclusivo: puede haber múltiples instancias de PointHandler, y el conjunto de puntos de contacto pulsados se distribuirá entre ellas. Cada PointHandler que ha elegido un punto para rastrear tiene su propiedad active true . A continuación, seguirá rastreando el punto elegido hasta su liberación: las propiedades de point se mantendrán actualizadas. Cualquier objeto puede vincularse a estas propiedades y seguir así los movimientos del punto.

Al ser sólo un agarrador pasivo, tiene la capacidad de mantener una supervisión independiente de todos los movimientos. El agarre pasivo no puede ser robado o anulado incluso cuando se detectan otros gestos y se producen agarres exclusivos.

Si su objetivo es la vigilancia ortogonal de eventpoints, una alternativa más antigua era QObject::installEventFilter(), pero eso nunca ha sido una característica incorporada en QtQuick: requiere algo de código C++, como una subclase de QQuickItem. PointHandler es más eficiente que eso, porque sólo los eventos de puntero le serán entregados, durante el curso de la entrega normal de eventos en QQuickWindow; mientras que un filtro de eventos necesita filtrar todos los QEvents de todos los tipos, y por lo tanto se establece como un potencial cuello de botella en la entrega de eventos.

Un posible caso de uso es añadir este manejador a un Item transparente que esté por encima del resto de la escena (por tener un alto valor z ), de forma que cuando un punto sea pulsado recientemente, será entregado a ese Item y a sus manejadores primero, proporcionando la oportunidad de tomar el agarre pasivo tan pronto como sea posible. Un elemento de este tipo (como un panel de vidrio sobre toda la interfaz de usuario) puede ser un padre conveniente para otros elementos que visualizan el tipo de retroalimentación reactiva que siempre debe estar en la parte superior; y del mismo modo puede ser el padre de ventanas emergentes, popovers, diálogos y así sucesivamente. Si se va a utilizar de esta forma, puede ser útil para tu main.cpp utilizar QQmlContext::setContextProperty() para hacer el "panel de cristal" accesible por ID a toda la UI, de forma que otros Items y PointHandlers puedan ser reparentados a él.

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
            }
        }
    }
}

Como todos los manejadores de entrada, un PointHandler tiene una propiedad target, que puede ser utilizada como un lugar conveniente para poner un elemento de seguimiento de puntos; pero PointHandler no manipulará automáticamente el elemento target de ninguna manera. Es necesario utilizar bindings para que reaccione a point.

Nota: En macOS, PointHandler no reacciona a múltiples dedos en el trackpad por defecto, aunque sí reacciona a un punto pulsado (posición del ratón). Esto se debe a que macOS puede proporcionar reconocimiento nativo de gestos o puntos táctiles sin procesar, pero no ambos. Preferimos utilizar el evento de gesto nativo en PinchHandler, por lo que no queremos desactivarlo habilitando el toque. Sin embargo, MultiPointTouchArea sí habilita el tacto, deshabilitando así el reconocimiento nativo de gestos en toda la ventana; por lo que es una alternativa si sólo quieres reaccionar a todos los puntos táctiles pero no requieres la experiencia suave de gestos nativos.

Vea también MultiPointTouchArea, HoverHandler, y Qt Quick Ejemplos - Manejadores de Puntero.

Documentación de propiedades

acceptedButtons : flags

Los botones del ratón que pueden activar este PointHandler.

Por defecto, esta propiedad se establece en Qt.LeftButton. Puede establecerse en una combinación OR de botones del ratón, e ignorará los eventos en los que se pulsen o mantengan pulsados otros botones. Si se establece en Qt.NoButton, significa que no le importan los botones en absoluto, e ignora los eventos sintéticos del ratón que provengan de cualquier dispositivo para el que ya esté manejando un eventPoint auténtico.

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
    }
}

Nota: En una pantalla táctil, no hay botones, por lo que esta propiedad no impide que PointHandler reaccione a los puntos táctiles.

Nota: Por defecto, cuando esta propiedad tiene el valor Qt.LeftButton, si se permite que un dispositivo que no es el ratón PointerDevice (como una pantalla táctil o un lápiz óptico de tableta gráfica) genere eventos sintéticos de ratón, éstos normalmente indican que el botón izquierdo del ratón está pulsado, y esos eventos pueden desactivar temporalmente el PointHandler que ya estaba reaccionando a un eventPoint auténtico del dispositivo. Es útil declarar

acceptedButtons: \c Qt.NoButton

para evitar este problema. Véase también Qt::AA_SynthesizeMouseForUnhandledTouchEvents y Qt::AA_SynthesizeMouseForUnhandledTabletEvents.

acceptedDevices : flags

Los tipos de dispositivos señaladores que pueden activar este PointHandler.

Por defecto, esta propiedad está establecida en PointerDevice.AllDevices. Si la establece en una combinación OR de tipos de dispositivos, ignorará los eventos de los que no coincidan devices:

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

Si se establece esta propiedad, PointHandler requiere que se pulsen los modificadores de teclado dados para reaccionar a PointerEvents, y en caso contrario los ignora.

Si esta propiedad está establecida a Qt.KeyboardModifierMask (el valor por defecto), entonces PointHandler ignora las teclas modificadoras.

Por ejemplo, un Item podría tener dos manejadores, uno de los cuales se activa sólo si se pulsa el modificador de teclado requerido:

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
        }
    }
}

Si configuras acceptedModifiers con una combinación OR de teclas modificadoras, significa que todos esos modificadores deben estar pulsados para activar el manejador.

Los modificadores disponibles son los siguientes

ConstanteDescripción
NoModifierNo se permite ninguna tecla modificadora.
ShiftModifierDebe pulsarse una tecla Shift del teclado.
ControlModifierDebe pulsarse una tecla Ctrl del teclado.
AltModifierDebe pulsarse una tecla Alt del teclado.
MetaModifierDebe pulsarse una tecla Meta del teclado.
KeypadModifierPulsar un botón del teclado.
GroupSwitchModifierSólo X11 (a menos que se active en Windows mediante un argumento de línea de comandos). Debe pulsarse una tecla Mode_switch del teclado.
KeyboardModifierMaskAl controlador no le importa qué modificadores se pulsan.

Véase también Qt::KeyboardModifier.

acceptedPointerTypes : flags

Los tipos de instrumentos señaladores (dedo, lápiz óptico, goma de borrar, etc.) que pueden activar este PointHandler.

Por defecto, esta propiedad se establece en PointerDevice.AllPointerTypes. Si se establece en una combinación OR de tipos de dispositivos, se ignorarán los eventos de los que no coincidan devices:

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"
    }
}

El Qt Quick Ejemplos - Manejadores de Puntero incluye un ejemplo más complejo para dibujar en un Lienzo con una tableta gráfica.

active : bool [read-only]

Esto se mantiene true siempre que se satisfagan las restricciones y este PointHandler esté reaccionando. Esto significa que está manteniendo sus propiedades actualizadas de acuerdo a los movimientos del eventPoints que satisfacen las restricciones.

cursorShape : Qt::CursorShape

Esta propiedad contiene la forma del cursor que aparecerá siempre que el ratón se sitúe sobre el elemento parent mientras active esté true.

Las formas de cursor disponibles son:

  • 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.CursorManoCerrada
  • Qt.DragCopyCursor
  • Qt.DragMoveCursor
  • Qt.DragLinkCursor

El valor por defecto no está establecido, lo que permite que aparezca el elemento cursor de parent. Esta propiedad puede restablecerse a la misma condición inicial estableciéndola a undefined.

Nota: Cuando esta propiedad no ha sido establecida, o ha sido establecida a undefined, si se lee el valor devolverá Qt.ArrowCursor.

Véase también Qt::CursorShape, QQuickItem::cursor(), y HoverHandler::cursorShape.

enabled : bool

Si un PointerHandler está desactivado, rechazará todos los eventos y no se emitirá ninguna señal.

Si un PointerHandler's parent es disabled, el manejador también será efectivamente desactivado, incluso cuando la propiedad enabled permanezca true.

Nota: HoverHandler se comporta de manera diferente: consulte la documentación de su propiedad enabled para obtener más información.

grabPermissions : flags

Esta propiedad especifica los permisos cuando la lógica de este manejador decide hacerse cargo de la toma exclusiva, o cuando se le pide que apruebe la toma o cancelación de la toma por parte de otro manejador.

ConstanteDescripción
PointerHandler.TakeOverForbiddenEste manejador no toma ni da permiso de toma a ningún tipo de Item o Manejador.
PointerHandler.CanTakeOverFromHandlersOfSameTypeEste manejador puede tomar el agarre exclusivo de otro manejador de la misma clase.
PointerHandler.CanTakeOverFromHandlersOfDifferentTypeEste manejador puede tomar el agarre exclusivo de cualquier tipo de manejador.
PointerHandler.CanTakeOverFromItemsEste manejador puede tomar el agarre exclusivo de cualquier tipo de Item.
PointerHandler.CanTakeOverFromAnythingEste manejador puede tomar la exclusiva de cualquier tipo de Item o Manejador.
PointerHandler.ApprovesTakeOverByHandlersOfSameTypeEste manipulador da permiso a otro manipulador de la misma clase para tomar la captura.
PointerHandler.ApprovesTakeOverByHandlersOfDifferentTypeEste manipulador da permiso a cualquier tipo de manipulador para tomar la captura.
PointerHandler.ApprovesTakeOverByItemsEste manejador da permiso para que cualquier tipo de Item tome el agarre.
PointerHandler.ApprovesCancellationEste manejador permitirá que su agarre sea nulo.
PointerHandler.ApprovesTakeOverByAnythingEste manipulador permite que cualquier tipo de objeto o manipulador tome la captura.

El valor predeterminado es PointerHandler.CanTakeOverFromItems | PointerHandler.CanTakeOverFromHandlersOfDifferentType | PointerHandler.ApprovesTakeOverByAnything que permite la mayoría de los escenarios de toma, pero evita, por ejemplo, dos PinchHandlers luchando por los mismos puntos de contacto.

margin : real

El margen más allá de los límites del elemento parent dentro del cual un eventPoint puede activar este manejador.

El valor por defecto es 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

El Item que es el ámbito del manejador; el Item en el que fue declarado. El manejador manejará eventos en nombre de este Item, lo que significa que un evento de puntero es relevante si al menos uno de sus eventPoints ocurre dentro del interior del Item. Inicialmente target() es el mismo, pero puede ser reasignado.

Véase también target y QObject::parent().

point : handlerPoint [read-only]

El eventPoint que se está manejando actualmente. Cuando no se está gestionando ningún punto, este objeto se restablece a los valores por defecto (todas las coordenadas son 0).

target : real

Una propiedad que puede contener convenientemente un Item para ser manipulado o para mostrar retroalimentación. A diferencia de otros Manejadores de Puntero, PointHandler no hace nada con target por sí mismo: normalmente necesitas crear enlaces reactivos a propiedades como SinglePointHandler::point y PointHandler::active. Si declaras una instancia de Item aquí, necesitas establecer explícitamente su parent, porque PointHandler no es un Item.

Por defecto, es el mismo que parent, el elemento dentro del cual se declara el controlador.

Documentación sobre señales

canceled(eventPoint point)

Si este manejador ya ha agarrado el point dado, esta señal es emitida cuando el agarre es robado por un Manejador de Punteros o Item diferente.

Nota: El manejador correspondiente es onCanceled.

grabChanged(PointerDevice::GrabTransition transition, eventPoint point)

Esta señal se emite cuando la cuchara ha cambiado de alguna manera que es relevante para este controlador.

El transition (verbo) dice lo que ha pasado. El point (objeto) es el punto que fue agarrado o no agarrado.

Los valores válidos para transition son:

ConstanteDescripción
PointerDevice.GrabExclusiveEste gestor ha asumido la responsabilidad principal de gestionar el point.
PointerDevice.UngrabExclusiveEste manipulador ha renunciado a su captura exclusiva anterior.
PointerDevice.CancelGrabExclusiveLa captura exclusiva de este gestor ha sido asumida o cancelada.
PointerDevice.GrabPassiveEste manipulador ha adquirido una captura pasiva, para supervisar la point.
PointerDevice.UngrabPassiveEste manipulador ha renunciado a su captura pasiva anterior.
PointerDevice.CancelGrabPassiveLa captura pasiva anterior de este manipulador ha finalizado de forma anormal.

Nota: El controlador correspondiente es onGrabChanged.

© 2026 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.