DragHandler QML Type
Handler für das Ziehen. Mehr...
Import Statement: | import QtQuick |
Inherits: |
Eigenschaften
- acceptedButtons : flags
- acceptedDevices : flags
- acceptedModifiers : flags
- acceptedPointerTypes : flags
- active : bool
- activeTranslation : vector2d
- cursorShape : Qt::CursorShape
- dragThreshold : int
- enabled : bool
- grabPermissions : flags
- margin : real
- parent : Item
- persistentTranslation : vector2d
- snapMode : enumeration
- target : Item
- xAxis
- xAxis.activeValue : real
- xAxis.enabled : bool
- xAxis.maximum : real
- xAxis.minimum : real
- yAxis
- yAxis.activeValue : real
- yAxis.enabled : bool
- yAxis.maximum : real
- yAxis.minimum : real
Signale
- canceled(eventPoint point)
- grabChanged(PointerDevice::GrabTransition transition, eventPoint point)
Detaillierte Beschreibung
DragHandler ist ein Handler, der verwendet wird, um ein Element interaktiv zu bewegen. Wie andere Input Handler ist er standardmäßig voll funktionsfähig und manipuliert seine target.
import QtQuick Rectangle { width: 100 height: 100 color: "lightsteelblue" DragHandler { } }
Er hat Eigenschaften, um den Bereich des Ziehens einzuschränken.
Wenn er innerhalb eines Elements deklariert wird, aber ein anderes target zugewiesen bekommt, dann behandelt er Ereignisse innerhalb der Grenzen des parent Elements, manipuliert aber stattdessen das target
Element:
import QtQuick Item { width: 640 height: 480 Rectangle { id: feedback border.color: "red" width: Math.max(10, handler.centroid.ellipseDiameters.width) height: Math.max(10, handler.centroid.ellipseDiameters.height) radius: Math.max(width, height) / 2 visible: handler.active } DragHandler { id: handler target: feedback } }
Eine dritte Möglichkeit besteht darin, target auf null
zu setzen und auf eine andere Weise auf Eigenschaftsänderungen zu reagieren:
import QtQuick Item { width: 640 height: 480 DragHandler { id: handler target: null } Text { color: handler.active ? "darkgreen" : "black" text: handler.centroid.position.x.toFixed(1) + "," + handler.centroid.position.y.toFixed(1) x: handler.centroid.position.x - width / 2 y: handler.centroid.position.y - height } }
Wenn minimumPointCount und maximumPointCount auf Werte größer als 1 gesetzt sind, muss der Benutzer so viele Finger in dieselbe Richtung ziehen, um mit dem Ziehen zu beginnen. Eine Mehrfinger-Ziehgeste kann unabhängig von einem (Standard-)Einfinger-DragHandler und einer PinchHandler auf demselben Item erkannt werden und kann daher verwendet werden, um eine andere Funktion unabhängig vom üblichen Pinch-Verhalten anzupassen: zum Beispiel eine Neigungstransformation oder einen anderen numerischen Wert, wenn target
auf null gesetzt ist. Wenn target
jedoch ein Element ist, ist centroid
der Punkt, an dem das Ziehen beginnt und zu dem target
verschoben wird (vorbehaltlich der Einschränkungen).
DragHandler kann zusammen mit der angehängten Eigenschaft Drag verwendet werden, um Drag-and-Drop zu implementieren.
Siehe auch Drag, MouseArea, und Qt Quick Beispiele - Zeiger-Handler.
Dokumentation der Eigenschaft
acceptedButtons : flags |
Die Maustasten, die diese DragHandler aktivieren können.
Standardmäßig ist diese Eigenschaft auf Qt.LeftButton gesetzt. Sie kann auf eine ODER-Kombination von Maustasten gesetzt werden und ignoriert Ereignisse von anderen Tasten.
Wenn beispielsweise eine Komponente (wie TextEdit) das Ziehen mit der linken Taste bereits auf ihre eigene Art und Weise handhabt, kann sie durch eine DragHandler ergänzt werden, die beim Ziehen mit der rechten Taste etwas anderes tut:
Rectangle { id: canvas width: 640 height: 480 color: "#333" property int highestZ: 0 Repeater { model: FolderListModel { nameFilters: ["*.qml"] } delegate: Rectangle { required property string fileName required property url fileUrl required property int index id: frame x: index * 30; y: index * 30 width: 320; height: 240 property bool dragging: ldh.active || rdh.active onDraggingChanged: if (dragging) z = ++canvas.highestZ border { width: 2; color: dragging ? "red" : "steelblue" } color: "beige" clip: true TextEdit { // drag to select text id: textEdit textDocument.source: frame.fileUrl x: 3; y: 3 BoundaryRule on y { id: ybr minimum: textEdit.parent.height - textEdit.height; maximum: 0 minimumOvershoot: 200; maximumOvershoot: 200 overshootFilter: BoundaryRule.Peak } } DragHandler { id: rdh // right-drag to position the "window" acceptedButtons: Qt.RightButton } WheelHandler { target: textEdit property: "y" onActiveChanged: if (!active) ybr.returnToBounds() } Rectangle { anchors.right: parent.right width: titleText.implicitWidth + 12 height: titleText.implicitHeight + 6 border { width: 2; color: parent.border.color } bottomLeftRadius: 6 Text { id: titleText color: "saddlebrown" anchors.centerIn: parent text: frame.fileName textFormat: Text.PlainText } DragHandler { id: ldh // left-drag to position the "window" target: frame } } } } }
acceptedDevices : flags |
Die Arten von Zeigegeräten, die diese DragHandler aktivieren können.
Standardmäßig ist diese Eigenschaft auf PointerDevice.AllDevices eingestellt. Wenn Sie sie auf eine ODER-Kombination von Gerätetypen einstellen, werden Ereignisse von nicht übereinstimmenden Geräten ignoriert.
Hinweis: Nicht alle Plattformen sind in der Lage, zwischen Maus und Touchpad zu unterscheiden; und auf den Plattformen, auf denen dies möglich ist, möchten Sie oft, dass sich Maus und Touchpad gleich verhalten.
acceptedModifiers : flags |
Wenn diese Eigenschaft gesetzt ist, müssen die angegebenen Tastaturmodifikatoren gedrückt werden, um auf Zeigerereignisse zu reagieren, andernfalls werden sie ignoriert.
Zum Beispiel können zwei DragHandler zwei verschiedene Drag-and-Drop-Operationen durchführen, je nachdem, ob der Control
Modifikator gedrückt ist:
GridView { id: root width: 320 height: 480 cellWidth: 80 cellHeight: 80 interactive: false displaced: Transition { NumberAnimation { properties: "x,y" easing.type: Easing.OutQuad } } model: DelegateModel { id: visualModel model: 24 property var dropTarget: undefined property bool copy: false delegate: DropArea { id: delegateRoot width: 80 height: 80 onEntered: drag => { if (visualModel.copy) { if (drag.source !== icon) visualModel.dropTarget = icon } else { visualModel.items.move(drag.source.DelegateModel.itemsIndex, icon.DelegateModel.itemsIndex) } } Rectangle { id: icon objectName: DelegateModel.itemsIndex property string text Component.onCompleted: { color = Qt.rgba(0.2 + (48 - DelegateModel.itemsIndex) * Math.random() / 48, 0.3 + DelegateModel.itemsIndex * Math.random() / 48, 0.4 * Math.random(), 1.0) text = DelegateModel.itemsIndex } border.color: visualModel.dropTarget === this ? "black" : "transparent" border.width: 2 radius: 3 width: 72 height: 72 anchors { horizontalCenter: parent.horizontalCenter verticalCenter: parent.verticalCenter } states: [ State { when: dragHandler.active || controlDragHandler.active ParentChange { target: icon parent: root } AnchorChanges { target: icon anchors { horizontalCenter: undefined verticalCenter: undefined } } } ] Text { anchors.centerIn: parent color: "white" font.pointSize: 14 text: controlDragHandler.active ? "+" : icon.text } DragHandler { id: dragHandler acceptedModifiers: Qt.NoModifier onActiveChanged: if (!active) visualModel.dropTarget = undefined } DragHandler { id: controlDragHandler acceptedModifiers: Qt.ControlModifier onActiveChanged: { visualModel.copy = active if (!active) { visualModel.dropTarget.text = icon.text visualModel.dropTarget.color = icon.color visualModel.dropTarget = undefined } } } Drag.active: dragHandler.active || controlDragHandler.active Drag.source: icon Drag.hotSpot.x: 36 Drag.hotSpot.y: 36 } } } }
Wenn diese Eigenschaft auf Qt.KeyboardModifierMask
gesetzt ist (der Standardwert), dann ignoriert DragHandler die Modifikatortasten.
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 DragHandler 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.
active : bool |
Dies gilt true
immer dann, wenn dieser Input Handler die alleinige Verantwortung für die Übergabe eines oder mehrerer eventPoints übernommen hat, indem er erfolgreich einen exklusiven Zugriff auf diese Punkte genommen hat. Das bedeutet, dass er seine Eigenschaften entsprechend den Bewegungen dieser EventPoints auf dem neuesten Stand hält und seine target (falls vorhanden) aktiv manipuliert.
activeTranslation : vector2d |
Die Übersetzung, während die Ziehgeste ausgeführt wird. Sie lautet 0, 0
, wenn die Geste beginnt, und erhöht sich, wenn der/die Ereignispunkt(e) nach unten und nach rechts gezogen werden. Nach Beendigung der Geste bleibt sie unverändert und wird bei Beginn der nächsten Ziehgeste wieder auf 0, 0
zurückgesetzt.
cursorShape : Qt::CursorShape |
Diese Eigenschaft enthält die Cursorform, die immer dann angezeigt wird, 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.
dragThreshold : int |
Die Entfernung in Pixeln, die der Benutzer eine eventPoint ziehen muss, damit sie als Ziehgeste behandelt wird.
Der Standardwert hängt von der Plattform und der Bildschirmauflösung ab. Er kann auf den Standardwert zurückgesetzt werden, indem er auf undefiniert gesetzt wird. Das Verhalten, wenn eine Ziehgeste beginnt, variiert in verschiedenen Handlern.
enabled : bool |
Wenn ein PointerHandler deaktiviert ist, werden alle Ereignisse zurückgewiesen und keine Signale ausgegeben.
grabPermissions : flags |
Diese Eigenschaft legt die Berechtigungen fest, wenn die Logik dieses Handlers beschließt, den exklusiven Greifvorgang zu übernehmen, oder wenn er von einem anderen Handler aufgefordert wird, die Übernahme oder den Abbruch des Greifvorgangs 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 nehmen. |
Die Voreinstellung ist PointerHandler.CanTakeOverFromItems | PointerHandler.CanTakeOverFromHandlersOfDifferentType | PointerHandler.ApprovesTakeOverByAnything
, was die meisten Übernahmeszenarien erlaubt, aber z.B. verhindert, dass zwei PinchHandler um dieselben Touchpoints kämpfen.
margin : real |
Der Spielraum außerhalb der Grenzen des parent Elements, innerhalb dessen ein eventPoint diesen Handler aktivieren kann. Sie können z. B. das Ziehen kleiner Elemente erleichtern, indem Sie dem Benutzer das Ziehen von einer nahe gelegenen Position aus ermöglichen:
Rectangle { width: 24 height: 24 border.color: "steelblue" Text { text: "it's\ntiny" font.pixelSize: 7 rotation: -45 anchors.centerIn: parent } DragHandler { margin: 12 } }
parent : Item |
Die Item, die der Anwendungsbereich des Handlers ist; das Element, in dem er deklariert wurde. Der Handler wird Ereignisse im Namen dieses Items behandeln, was bedeutet, dass ein Zeiger-Ereignis relevant ist, wenn mindestens eines seiner eventPoints im Inneren des Items auftritt. Ursprünglich ist target() derselbe, aber er kann neu zugewiesen werden.
Siehe auch target und QObject::parent().
persistentTranslation : vector2d |
Die auf das Ziel anzuwendende Übersetzung, wenn sie nicht null
ist. Ansonsten können Bindungen verwendet werden, um beliebige Dinge mit diesem Wert zu tun. Während die Ziehgeste ausgeführt wird, wird activeTranslation kontinuierlich hinzugefügt; nach Beendigung der Geste bleibt der Wert unverändert.
snapMode : enumeration |
Diese Eigenschaft enthält den Fangmodus.
Der Fangmodus konfiguriert das Einrasten des Mittelpunkts des Zielelements auf eventPoint.
Mögliche Werte:
Konstant | Beschreibung |
---|---|
DragHandler.NoSnap | Nie einrasten |
DragHandler.SnapAuto | Das Ziel rastet ein, wenn die Taste eventPoint außerhalb des Zielobjekts gedrückt wurde und das Zielobjekt ein Nachkomme des Objekts parent ist (Standard) |
DragHandler.SnapWhenPressedOutsideTarget | Das Ziel rastet ein, wenn die Taste eventPoint außerhalb des Ziels gedrückt wurde. |
DragHandler.SnapAlways | Immer einrasten |
target : Item |
Das Element, das von diesem Handler bearbeitet werden soll.
Standardmäßig ist es dasselbe wie parent, das Element, innerhalb dessen der Handler deklariert ist. Es kann jedoch manchmal nützlich sein, das Ziel auf ein anderes Element zu setzen, um Ereignisse innerhalb eines Elements zu behandeln, aber ein anderes zu manipulieren; oder auf null
, um das Standardverhalten zu deaktivieren und stattdessen etwas anderes zu tun.
xAxis
steuert die Beschränkungen für das horizontale Ziehen.
minimum
ist der minimale akzeptable Wert von x, der auf target angewendet werden soll. maximum
ist der maximale akzeptable Wert von x, der auf target angewendet werden soll. Wenn enabled
wahr ist, ist horizontales Ziehen erlaubt. activeValue
ist dasselbe wie activeTranslation.x.
Das Signal activeValueChanged
wird ausgegeben, wenn sich activeValue
ändert, um die Schrittweite anzugeben, um die es sich geändert hat. Dies ist für die schrittweise Anpassung einer Eigenschaft über mehrere Handler gedacht.
yAxis
steuert die Beschränkungen für das vertikale Ziehen.
minimum
ist der minimale akzeptable Wert von y, der auf target angewendet werden soll. maximum
ist der maximale akzeptable Wert von y, der auf target angewendet werden soll. Wenn enabled
wahr ist, ist vertikales Ziehen erlaubt. activeValue
ist dasselbe wie activeTranslation.y.
Das Signal activeValueChanged
wird ausgegeben, wenn sich activeValue
ändert, um die Schrittweite anzugeben, um die es sich geändert hat. Dies ist für die schrittweise Anpassung einer Eigenschaft über mehrere Handler gedacht:
import QtQuick Rectangle { width: 50; height: 200 Rectangle { id: knob width: parent.width; height: width; radius: width / 2 anchors.centerIn: parent color: "lightsteelblue" Rectangle { antialiasing: true width: 4; height: 20 x: parent.width / 2 - 2 } WheelHandler { property: "rotation" } } DragHandler { target: null dragThreshold: 0 yAxis.onActiveValueChanged: (delta)=> { knob.rotation -= delta } } }
Signal-Dokumentation
canceled(eventPoint point) |
Wenn dieser Handler die 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 verä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.