aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/doc/src
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/doc/src')
-rw-r--r--src/quick/doc/src/advtutorial.qdoc2
-rw-r--r--src/quick/doc/src/concepts/effects/particles.qdoc1
-rw-r--r--src/quick/doc/src/concepts/effects/topic.qdoc3
-rw-r--r--src/quick/doc/src/concepts/input/focus.qdoc4
-rw-r--r--src/quick/doc/src/concepts/inputhandlers/qtquickhandlers-index.qdoc5
-rw-r--r--src/quick/doc/src/concepts/layouts/qtquicklayouts-index.qdoc2
-rw-r--r--src/quick/doc/src/concepts/layouts/qtquicklayouts-overview.qdoc10
-rw-r--r--src/quick/doc/src/concepts/layouts/qtquicklayouts-responsive.qdoc101
-rw-r--r--src/quick/doc/src/concepts/modelviewsdata/cppmodels.qdoc40
-rw-r--r--src/quick/doc/src/concepts/modelviewsdata/modelview.qdoc162
-rw-r--r--src/quick/doc/src/concepts/positioning/righttoleft.qdoc10
-rw-r--r--src/quick/doc/src/concepts/positioning/topic.qdoc1
-rw-r--r--src/quick/doc/src/concepts/visualcanvas/adaptations.qdoc22
-rw-r--r--src/quick/doc/src/concepts/visualcanvas/scenegraph.qdoc164
-rw-r--r--src/quick/doc/src/dynamicview-tutorial.qdoc1
-rw-r--r--src/quick/doc/src/examples.qdoc68
-rw-r--r--src/quick/doc/src/guidelines/qtquick-bestpractices.qdoc35
-rw-r--r--src/quick/doc/src/guidelines/qtquick-tool-qmllint.qdoc140
-rw-r--r--src/quick/doc/src/guidelines/qtquick-toolsnutilities.qdoc22
-rw-r--r--src/quick/doc/src/includes/item.qdocinc4
-rw-r--r--src/quick/doc/src/includes/layout.qdocinc2
-rw-r--r--src/quick/doc/src/internal/deliverMatchingPointsToItem.puml14
-rw-r--r--src/quick/doc/src/internal/ideal-pointer-event-delivery-single-drag.dox242
-rw-r--r--src/quick/doc/src/internal/ideal-pointer-event-delivery.dox22
-rw-r--r--src/quick/doc/src/internal/ideal-pointer-event-delivery.puml55
-rw-r--r--src/quick/doc/src/internal/pinchAndDragHandlers-singleMoveDelivery.svg851
-rw-r--r--src/quick/doc/src/internal/pinchAndDragHandlers-singlePressDelivery.svg714
-rw-r--r--src/quick/doc/src/internal/pinchAndDragHandlers-singlePressPrep.svg648
-rw-r--r--src/quick/doc/src/internal/pinchAndDragHandlers-singleReleaseDelivery.svg825
-rw-r--r--src/quick/doc/src/internal/pinchAndDragHandlers.dot30
-rw-r--r--src/quick/doc/src/internal/pinchAndDragHandlers.svg137
-rw-r--r--src/quick/doc/src/internal/textEdit.dot52
-rw-r--r--src/quick/doc/src/qmltypereference.qdoc107
-rw-r--r--src/quick/doc/src/qtquick-android.qdoc14
-rw-r--r--src/quick/doc/src/qtquick-how-tos.qdoc109
-rw-r--r--src/quick/doc/src/qtquick.qdoc29
36 files changed, 4292 insertions, 356 deletions
diff --git a/src/quick/doc/src/advtutorial.qdoc b/src/quick/doc/src/advtutorial.qdoc
index dc79abbc1e..6a00162753 100644
--- a/src/quick/doc/src/advtutorial.qdoc
+++ b/src/quick/doc/src/advtutorial.qdoc
@@ -411,7 +411,7 @@ score data to the web server. If it had returned a QML file (or a URL to a QML f
way as you did with the blocks.
An alternate way to access and submit web-based data would be to use QML types designed for this purpose. XmlListModel
-makes it very easy to fetch and display XML based data such as RSS in a QML application (see the Flickr demo for an example).
+makes it very easy to fetch and display XML based data such as RSS in a QML application.
\section2 That's It!
diff --git a/src/quick/doc/src/concepts/effects/particles.qdoc b/src/quick/doc/src/concepts/effects/particles.qdoc
index 618e736b70..e66d6f9b4b 100644
--- a/src/quick/doc/src/concepts/effects/particles.qdoc
+++ b/src/quick/doc/src/concepts/effects/particles.qdoc
@@ -2,6 +2,7 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
+ \keyword Qt Quick Particles
\qmlmodule QtQuick.Particles
\title Qt Quick Particles QML Types
\ingroup qmlmodules
diff --git a/src/quick/doc/src/concepts/effects/topic.qdoc b/src/quick/doc/src/concepts/effects/topic.qdoc
index afdbf0f9a2..bd54313106 100644
--- a/src/quick/doc/src/concepts/effects/topic.qdoc
+++ b/src/quick/doc/src/concepts/effects/topic.qdoc
@@ -15,6 +15,9 @@ a useful way to subtly communicate to the user (for example, which visual
item is active, or how focus is being transferred). Over-use of visual
effects can actually detract from the user-experience.
+For more information about applying post-processing effects, such as blur, drop
+shadow, or colorize, to an \l Item, see the \l MultiEffect QML type.
+
\section1 Visual Transformation
Visual objects can be transformed. For example, they can be scaled or rotated.
diff --git a/src/quick/doc/src/concepts/input/focus.qdoc b/src/quick/doc/src/concepts/input/focus.qdoc
index 225eea7788..8c6f73024b 100644
--- a/src/quick/doc/src/concepts/input/focus.qdoc
+++ b/src/quick/doc/src/concepts/input/focus.qdoc
@@ -18,8 +18,8 @@ scope based extension to Qt's traditional keyboard focus model.
When the user presses or releases a key, the following occurs:
\list 1
\li Qt receives the key action and generates a key event.
-\li If a \l QQuickWindow is the active window, the key event
-is delivered to it.
+\li If a \l QQuickWindow is the \l{QGuiApplication::focusWindow()}{focus window}
+of the application, the key event is delivered to it.
\li The key event is delivered by the scene to the \l Item with
\e {active focus}. If no item has active focus, the key event is ignored.
\li If the \l QQuickItem with active focus accepts the key event, propagation
diff --git a/src/quick/doc/src/concepts/inputhandlers/qtquickhandlers-index.qdoc b/src/quick/doc/src/concepts/inputhandlers/qtquickhandlers-index.qdoc
index 182773b0f5..a28ce21172 100644
--- a/src/quick/doc/src/concepts/inputhandlers/qtquickhandlers-index.qdoc
+++ b/src/quick/doc/src/concepts/inputhandlers/qtquickhandlers-index.qdoc
@@ -17,6 +17,8 @@
behavioral concerns are better separated, and the behavior is built up by
finer-grained composition.
+ The \l {Qt Quick Examples - Pointer Handlers} demonstrates some use cases for these.
+
The pre-existing \l Keys attached property is similar in concept, so we
refer to the pointing-device-oriented handlers plus \c Keys together as the
set of Input Handlers. We expect to offer more attached-property use cases
@@ -70,7 +72,8 @@
PointHandler) can work only with passive grabs; others require exclusive
grabs; and others can "lurk" with passive grabs until they detect that a
gesture is being performed, and then make the transition from passive to
- exclusive grab.
+ exclusive grab. TapHandler's grabbing behavior is
+ \l {TapHandler::gesturePolicy}{configurable}.
When a grab transition is requested, \l PointerHandler::grabPermissions,
\l QQuickItem::keepMouseGrab() and \l QQuickItem::keepTouchGrab() control
diff --git a/src/quick/doc/src/concepts/layouts/qtquicklayouts-index.qdoc b/src/quick/doc/src/concepts/layouts/qtquicklayouts-index.qdoc
index b064368ce7..908a82fdcb 100644
--- a/src/quick/doc/src/concepts/layouts/qtquicklayouts-index.qdoc
+++ b/src/quick/doc/src/concepts/layouts/qtquicklayouts-index.qdoc
@@ -25,12 +25,14 @@
\list
\li \l {Qt Quick Layouts Overview}
+ \li \l {Qt Quick Responsive Layouts}
\endlist
\section1 Examples
\list
\li \l {Qt Quick Layouts - Basic Example}
+ \li \l {Qt Quick Layouts - Responsive Layout Example}
\endlist
\section1 Reference
diff --git a/src/quick/doc/src/concepts/layouts/qtquicklayouts-overview.qdoc b/src/quick/doc/src/concepts/layouts/qtquicklayouts-overview.qdoc
index 115b8faf44..6173e78f6d 100644
--- a/src/quick/doc/src/concepts/layouts/qtquicklayouts-overview.qdoc
+++ b/src/quick/doc/src/concepts/layouts/qtquicklayouts-overview.qdoc
@@ -144,11 +144,11 @@
effective preferred height is determined from the
\l{Item::implicitHeight}{implicitHeight}.
- \note If you don't specify neither preferredWidth nor implicitWidth,
- the Layout will query \l width as an ultimate value for the effective
- preferred width. However, you shouldn't rely on \l width as a source for
- the effective preferred width, as that may cause unexpected behavior.
- For instance, changing the \l{Item::width}{width} or
+ \note If you don't specify neither preferredWidth nor implicitWidth, the
+ Layout will query \l {Item::}{width} as an ultimate value for the effective
+ preferred width. However, you shouldn't rely on \l {Item::}{width} as a
+ source for the effective preferred width, as that may cause unexpected
+ behavior. For instance, changing the \l{Item::}{width} or
\l{Item::height}{height} properties won't trigger a layout rearrangement,
or the layout might use the actual width and height -- not the width and
height specified in your QML file -- when forced to do a full rebuild.
diff --git a/src/quick/doc/src/concepts/layouts/qtquicklayouts-responsive.qdoc b/src/quick/doc/src/concepts/layouts/qtquicklayouts-responsive.qdoc
new file mode 100644
index 0000000000..6287815f65
--- /dev/null
+++ b/src/quick/doc/src/concepts/layouts/qtquicklayouts-responsive.qdoc
@@ -0,0 +1,101 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \page qtquicklayouts-responsive.html
+ \title Qt Quick Responsive Layouts
+ \brief A guideline to make Qt Quick Layouts adaptive to screen size.
+
+ Layouts are a good technique to make resizable user interfaces. However,
+ this approach has its limitations as we cannot shrink and expand items
+ limitless without sacrificing usability and aesthetics. At some point, it
+ makes more sense to reorganize, remove or add certain elements. Adapting to
+ different devices (e.g. phones and tables) and screen orientations
+ (landscape or portrait) can be implemented similarly. This is what
+ we usually understand as responsive layouts and \l {Qt Quick Layouts}
+ provide various APIs to implement them.
+
+ \section1 Static hierarchy, adaptive layout
+
+ Layouts have a hierarchy, which is usually defined by the declarative QML
+ code. For some simple responsive layouts, it is sufficient to keep the
+ hierarchy unmodified and instead just tweak some of the properties that
+ affect layouting.
+
+ \section2 Declarative description
+
+ The simplest approach to change layouting is to modify layout properties
+ and \l {Layout} attached properties with small expressions. You can for
+ instance use ternary operators in order to modify the layout depending
+ on its width.
+ \l {Item} properties, such as \l {Item::visible}{Item.visible},
+ hiding or showing various parts of the interface, can be modified the same
+ way.
+
+ In the following snippet, this concept is used to change a two-column
+ layout into a single-column layout if the window width is smaller than a
+ certain value.
+
+ \snippet layouts/responsiveDeclarative.qml document
+
+ The resulting layouts look like this, depending on the width of the window.
+
+ \div {class="float-right"}
+ \inlineimage simpleProxy.png
+ \enddiv
+
+ Various levels of layouts and items can be nested but \l {Item}{Items} can only be moved within a their \l{Item::parent}{Item.parent}.
+
+ \section2 States
+
+ The same result can be achieved with \l {Qt Quick States}. The upside of
+ using states is that the \l {Layout} properties for a specific layout are
+ collected at a single point in the QML file (at least the changing ones).
+ The previously shown example can be implemented as follows and the result
+ looks and behaves the exact same.
+
+ \snippet layouts/responsiveStates.qml document
+
+ \section2 LayoutItemProxy
+
+ A third approach is the application of the \l {LayoutItemProxy}. The
+ implementation of the previously shown minimalistic example can be found in
+ the type documentation. In contrast to previously shown solutions, the
+ \l {LayoutItemProxy} enables the declaration of completely separate layouts
+ for various form factors. Especially with more complex layouts this might be
+ useful to improve and maintain a reasonable source code structure.
+
+ Note, that the \l{LayoutItemProxy} API is a technical preview and might
+ be subject to change or removal in future Qt versions.
+
+ \section1 Adaptive hierarchy, adaptive layout
+
+ More complex reconstructions of the layout might require changes to
+ the hierarchy. A small stand-alone button in a small layout might be
+ combined with other buttons and put into a box of a larger layout. An item
+ that is fully visible in one layout, might require a \l {Flickable} in
+ another, smaller layout. In this scenario, it is best to rely on the \l {LayoutItemProxy}. The \l {LayoutItemProxy} allows to move \l{Item}{Items} across various hierarchy levels and between different \l{Item::parent}{Item.parent}.
+
+ The \l {Qt Quick Layouts - Responsive Layout Example} shows a case where an
+ item is moved between different hierarchy levels, put into a \l {Flickable}
+ in one case and on the top level in another layout. The two resulting
+ layouts look as follows.
+
+ \div {class="float-right"}
+ \image qtquicklayouts-example-responsivelayouts.png
+ \enddiv
+
+
+ \section1 Useful links: Consult your design guidelines
+
+ Many design guidelines offer help and tips to create responsive layouts.
+ Implementing the respective techniques is possible with the APIs mentioned
+ above. For further information we recommend the following links:
+
+ \list
+ \li \l {https://developer.apple.com/design/human-interface-guidelines/layout}{Apple human interface guidelines}
+ \li \l {https://m3.material.io/foundations/layout/applying-layout/window-size-classes}{Material3 layouts}
+ \li \l {https://learn.microsoft.com/en-us/windows/apps/design/layout/responsive-design}{Microsoft Fluent responsive design techniques}
+ \endlist
+
+*/
diff --git a/src/quick/doc/src/concepts/modelviewsdata/cppmodels.qdoc b/src/quick/doc/src/concepts/modelviewsdata/cppmodels.qdoc
index d84ccc9176..3e8fbf7dfd 100644
--- a/src/quick/doc/src/concepts/modelviewsdata/cppmodels.qdoc
+++ b/src/quick/doc/src/concepts/modelviewsdata/cppmodels.qdoc
@@ -43,7 +43,7 @@ within the Qt install directory.
\note There is no way for the view to know that the contents of a QStringList
have changed. If the QStringList changes, it will be necessary to reset
-the model by calling QQmlContext::setContextProperty() again.
+the model by setting the view's \c model property again.
\section2 QVariantList-based Model
@@ -79,10 +79,8 @@ the ListView delegate:
\snippet models/objectlistmodel/view.qml 0
-Note the use of \c color property with qualifier.
-The properties of the object are not replicated in the \c model
-object, as they are easily available via the \c modelData
-object.
+Note the use of the \c color property. You can require existing properties
+by declaring them as \c required in a derived type.
The complete source code for this example is available in
\l {models/objectlistmodel}{examples/quick/models/objectlistmodel}
@@ -90,7 +88,7 @@ within the Qt install directory.
Note: There is no way for the view to know that the contents of a QList
has changed. If the QList changes, it is necessary to reset
-the model by calling QQmlContext::setContextProperty() again.
+the model by setting the \c model property again.
\section2 QAbstractItemModel Subclass
@@ -230,12 +228,10 @@ model:
\section2 Exposing C++ Data Models to QML
-The above examples use QQmlContext::setContextProperty() to set
+The above examples use required properties on the view to set
model values directly in QML components. An alternative to this is to
-register the C++ model class as a QML type (either
-\l{Defining QML Types from C++}{directly} from a C++ entry-point, or within
-the initialization function of a \l{Creating C++ Plugins for QML}
-{QML C++ plugin}, as shown below). This would allow the model classes to be
+register the C++ model class as a QML type (see
+\l{Defining QML Types from C++}). This allows the model classes to be
created directly as types within QML:
\table
@@ -244,16 +240,12 @@ created directly as types within QML:
\li C++
\li
\code
-class MyModelPlugin : public QQmlExtensionPlugin
+class MyModel : public QAbstractItemModel
{
Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.QmlExtension.MyModel" FILE "mymodel.json")
-public:
- void registerTypes(const char *uri)
- {
- qmlRegisterType<MyModel>(uri, 1, 0,
- "MyModel");
- }
+ QML_ELEMENT
+
+ // [...]
}
\endcode
\row
@@ -262,7 +254,6 @@ public:
\qml
MyModel {
id: myModel
- ListElement { someProperty: "some value" }
}
\endqml
@@ -270,14 +261,17 @@ MyModel {
ListView {
width: 200; height: 250
model: myModel
- delegate: Text { text: someProperty }
+ delegate: Text {
+ required property string someProperty
+ text: someProperty
+ }
}
\endqml
\endtable
-See \l {Writing QML Extensions with C++} for details on writing QML C++
-plugins.
+See \l {Writing QML Extensions with C++} for details on writing QML types
+in C++.
\section2 Changing Model Data
diff --git a/src/quick/doc/src/concepts/modelviewsdata/modelview.qdoc b/src/quick/doc/src/concepts/modelviewsdata/modelview.qdoc
index dc44407766..3aaf40f199 100644
--- a/src/quick/doc/src/concepts/modelviewsdata/modelview.qdoc
+++ b/src/quick/doc/src/concepts/modelviewsdata/modelview.qdoc
@@ -4,9 +4,9 @@
/*!
\page qtquick-modelviewsdata-modelview.html
\title Models and Views in Qt Quick
-\brief how to display and form data in Qt Quick
+\brief how to display and format data in Qt Quick
-Simply put, applications need to form data and display the data. Qt Quick has the
+Most applications need to format data and display the data. Qt Quick has the
notion of \e models, \e views, and \e delegates to display data. They modularize
the visualization of data in order to give the developer or designer control
over the different aspects of the data. A developer can swap a list view with a
@@ -21,7 +21,7 @@ types for creating models.
\li \b View - a container that displays the data. The view might
display the data in a list or a grid.
\li \b Delegate - dictates how the data should appear in the view.
-The delegate takes each data in the model and encapsulates it. The data is
+The delegate takes each unit of data in the model and encapsulates it. The data is
accessible through the delegate. The delegate can also write data
back into editable models (e.g. in a TextField's onAccepted Handler).
\endlist
@@ -58,7 +58,7 @@ To visualize data, bind the view's \c model property to a model and the
Views allow visual customization through \e decoration properties such as
the \c header, \c footer, and \c section properties. By binding an object,
usually another visual object, to these properties, the views are
- decoratable. A footer may include a \l Rectangle type showcasing borders
+ decoratable. A footer may include a \l Rectangle type showing borders
or a header that displays a logo on top of the list.
Suppose that a specific club wants to decorate its members list with its brand
@@ -117,6 +117,14 @@ To visualize data, bind the view's \c model property to a model and the
\snippet qml/listview.qml delegate
\image listview-setup.png
+ \section2 Positioning of View Delegates
+
+ The type of view will determine how the items are positioned. \l {ListView}
+ will position the items in a straight line, depending on the \l {ListView::}{orientation},
+ while a \l {GridView} can lay them out in a 2 dimentional grid. It's \b {not} recommended
+ to bind directly on \l {Item::x}{x} and \l {Item::y}{y}, since the view's layouting
+ behavior will always take precedence over any positional binding.
+
\section2 Accessing Views and Models from Delegates
The list view to which the delegate is bound is accessible from the delegate
@@ -144,26 +152,41 @@ To visualize data, bind the view's \c model property to a model and the
bind to. Here is a ListModel with two roles, \e type and \e age, and a
ListView with a delegate that binds to these roles to display their values:
- \snippet qml/qml-data-models/listmodel-listview.qml document
+ \snippet qml/qml-data-models/listmodel-listview-required.qml document
- To get finer control over which roles are accessible, and to make delegates
- more self-contained and usable outside of views,
- \l{Required Properties}{required properties} can be used. If a delegate
- contains required properties, the named roles are not provided. Instead,
- the QML engine will check if the name of a required property matches that of
- a model role. If so, that property will be bound to the corresponding value
- from the model.
+ In most cases you should use \l{Required Properties}{required properties} to
+ pass model data into your delegates. If a delegate contains required
+ properties, the QML engine will check if the name of a required property
+ matches that of a model role. If so, that property will be bound to the
+ corresponding value from the model.
- \snippet qml/qml-data-models/listmodel-listview-required.qml document
+ In rare corner cases, you may want to transfer the model properties through
+ the QML context rather than as required properties. If no required
+ properties are present in your delegate, the named roles are provided as
+ context properties:
+
+ \snippet qml/qml-data-models/listmodel-listview.qml document
+
+ Context properties are invisible to tooling and prevent the
+ \l{Qt Quick Compiler} from optimizing your code. They make it harder to
+ reason about the specific data your delegate expects. There is no way to
+ explicitly populate the QML context from QML. If your component expects
+ data to be passed via the QML context, you can only use it in places
+ where the right context is made available via native means. This can be
+ your own C++ code or the specific implementations of surrounding elements.
+ Conversely, required properties can be set in a number of ways from QML or
+ via native means. Therefore, passing data via the QML context reduces the
+ re-usability of your components.
If there is a naming clash between the model's properties and the delegate's
properties, the roles can be accessed with the qualified \e model name
- instead. For example, if a \l Text type had \e type or \e age properties,
- the text in the above example would display those property values instead of
- the \e type and \e age values from the model item. In this case, the
- properties could have been referenced as \c model.type and \c model.age
- instead to ensure the delegate displays the property values from the model
- item.
+ instead. For example, if a \l Text type had (non-required) \e type or \e age
+ properties, the text in the above example would display those property
+ values instead of the \e type and \e age values from the model item. In this
+ case, the properties could have been referenced as \c model.type and
+ \c model.age instead to ensure the delegate displays the property values from
+ the model item. For this to work, you need to require a \c model property in
+ your delegate (unless you are using context properties).
A special \e index role containing the index of the item in the model is
also available to the delegate. Note this index is set to -1 if the item is
@@ -173,12 +196,71 @@ To visualize data, bind the view's \c model property to a model and the
possible to delay delegate destruction in some views via a \c delayRemove
attached property.)
- Models that do not have named roles (such as the ListModel shown
- below) will have the data provided via the \e modelData role. The \e
- modelData role is also provided for models that have only one role. In this
- case the \e modelData role contains the same data as the named role.
+ Remember that you can use integers or arrays as model:
- \note \e model, \e index, and \e modelData roles are not accessible
+ \qml
+ Repeater {
+ model: 5
+ Text {
+ required property int modelData
+ text: modelData
+ }
+ }
+ \endqml
+
+ \qml
+ Repeater {
+ model: ["one", "two", "three"]
+ Text {
+ required property string modelData
+ text: modelData
+ }
+ }
+ \endqml
+
+ Such models provide a singular, anonymous piece of data to each instance
+ of the delegate. Accessing this piece of data is the primary reason to
+ use \e modelData, but other models also provide \e modelData.
+
+ The object provided via the \e model role has a property with an empty name.
+ This anonymous property holds the \e modelData. Furthermore, the object
+ provided via the \e model role has another property called \e modelData.
+ This property is deprecated and also holds the \e modelData.
+
+ In addition to the \e model role, a \e modelData role is provided. The
+ \e modelData role holds the same data as the \e modelData property and the
+ anonymous property of the object provided via the \e model role.
+
+ The differences between the \e model role and the various means to access
+ \e modelData are as follows:
+
+ \list
+ \li Models that do not have named roles (such as integers or an array of
+ strings) have their data provided via the \e modelData role. The
+ \e modelData role does not necessarily contain an object in this case.
+ In the case of an integer model it would contain an integer (the index
+ of the current model item). In the case of an array of strings it would
+ contain a string. The \e model role still contains an object, but
+ without any properties for named roles. \e model still contains its
+ usual \e modelData and anonymous properties, though.
+ \li If the model has only one named role, the \e modelData role contains
+ the same data as the named role. It is not necessarily an object and it
+ does not contain the named role as a named property the way it usually
+ would. The \e model role still contains an object with the named role as
+ property, and the \e modelData and anonymous properties in this case.
+ \li For models with multiple roles, the \e modelData role is only provided as
+ a required property, not as a context property. This is due to backwards
+ compatibility with older versions of Qt.
+ \endlist
+
+ The anonymous property on \e model allows you to cleanly write delegates
+ that receive both their model data and the role name they should react
+ to as properties from the outside. You can provide a model without or
+ with only one named role, and an empty string as role. Then, a binding that
+ simply accesses \c{model[role]} will do what you expect. You don't have to
+ add special code for this case.
+
+ \note The \e model, \e index, and \e modelData roles are not accessible
if the delegate contains required properties, unless it has also required
properties with matching names.
@@ -285,7 +367,11 @@ To visualize data, bind the view's \c model property to a model and the
Component {
id: itemDelegate
- Text { text: "I am item number: " + index }
+
+ Text {
+ required property int index
+ text: "I am item number: " + index
+ }
}
ListView {
@@ -320,7 +406,11 @@ To visualize data, bind the view's \c model property to a model and the
Component {
id: myDelegate
- Text { text: model.color }
+
+ Text {
+ required property var model
+ text: model.color
+ }
}
ListView {
@@ -343,6 +433,20 @@ To visualize data, bind the view's \c model property to a model and the
\l{Using C++ Models with Qt Quick Views}
article.
+ \section2 Array models
+
+ You can use JavaScript arrays and various kinds of QML lists as models.
+ The elements of the list will be made available as model and modelData
+ by the rules outlined above: Singular data like integers or strings are
+ made available as singular modelData. Structured data like JavaScript
+ objects or QObjects are made available as structured model and modelData.
+
+ The individual model roles are also made available if you request them as
+ required properties. Since we cannot know in advance what objects will
+ appear in an array, any required property in a delegate will be populated,
+ possibly with a coercion of \c undefined to the required type. The
+ individual model roles are not made available via the QML context, though.
+ They would shadow all other context properties.
\section1 Repeaters
@@ -373,8 +477,8 @@ the model.
For more details, see the \l{qtquick-modelviewsdata-modelview.html#integers-as-models}{QML Data Models} document.
-If the model is a string list, the delegate is also exposed to a read-only
-\c modelData property that holds the string. For example:
+If the model is a string list, the delegate is also exposed to the usual
+read-only \c modelData property that holds the string. For example:
\table
\row
@@ -400,6 +504,8 @@ ListView {
anchors.fill: parent
model: EditableModel {}
delegate: TextEdit {
+ required property var model
+
width: ListView.view.width
height: 30
text: model.edit
diff --git a/src/quick/doc/src/concepts/positioning/righttoleft.qdoc b/src/quick/doc/src/concepts/positioning/righttoleft.qdoc
index 722d7b747b..7c7c314fc3 100644
--- a/src/quick/doc/src/concepts/positioning/righttoleft.qdoc
+++ b/src/quick/doc/src/concepts/positioning/righttoleft.qdoc
@@ -145,6 +145,16 @@ enter either \c LTR or \c RTL as the translation for the locale.
</context>
\endcode
+Next, add the following bindings to the root QML component of your application:
+\code
+LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft
+LayoutMirroring.childrenInherit: true
+\endcode
+
+The first binding ensures that the UI will be mirrored appropriately when a
+right-to-left locale is set. The second binding ensures that child items of the
+root component will also respect mirroring.
+
You can test that the layout direction works as expected by running your Qt Quick application with
the compiled translation file:
diff --git a/src/quick/doc/src/concepts/positioning/topic.qdoc b/src/quick/doc/src/concepts/positioning/topic.qdoc
index cd07d75985..dc9f647ee5 100644
--- a/src/quick/doc/src/concepts/positioning/topic.qdoc
+++ b/src/quick/doc/src/concepts/positioning/topic.qdoc
@@ -5,6 +5,7 @@
\page qtquick-positioning-topic.html
\title Important Concepts In Qt Quick - Positioning
\brief Overview of positioning concepts
+\ingroup explanations-programminglanguages
Visual items in QML can be positioned in a variety of ways. The most important
positioning-related concept is that of anchoring, a form of relative
diff --git a/src/quick/doc/src/concepts/visualcanvas/adaptations.qdoc b/src/quick/doc/src/concepts/visualcanvas/adaptations.qdoc
index c93733d819..d4c0c0eb2b 100644
--- a/src/quick/doc/src/concepts/visualcanvas/adaptations.qdoc
+++ b/src/quick/doc/src/concepts/visualcanvas/adaptations.qdoc
@@ -17,7 +17,7 @@ in form of plugins (openvg) or built-in to the Qt Quick library
From Qt 5.14 onwards, the default adaptation gains the option of rendering via
a graphics abstraction layer, the Qt Rendering Hardware Interface (RHI),
-provided by the \l QtGui module. When enabled, no direct OpenGL calls are made.
+provided by the \l [QtGui]{Qt GUI} module. When enabled, no direct OpenGL calls are made.
Rather, the scene graph renders by using the APIs provided by the abstraction
layer, which is then translated into OpenGL, Vulkan, Metal, or Direct 3D calls.
Shader handling is also unified by writing shader code once, compiling to
@@ -98,10 +98,11 @@ graphics. For more details, see
\page qtquick-visualcanvas-adaptations-software.html
The Software adaptation is an alternative renderer for \l {Qt Quick} 2 that uses the Raster paint
-engine to render the contents of the scene graph, instead of OpenGL. Consequently, some features
-and optimizations are not available. Most Qt Quick 2 applications can run without any modification,
-but any attempts to use unsupported features are ignored. By using the Software adaptation, it is
-possible to run Qt Quick 2 applications on hardware and platforms that do not have OpenGL support.
+engine to render the contents of the scene graph, instead of a hardware-accelerated 3D graphics API.
+Consequently, some features and optimizations are not available. Most Qt Quick 2 applications can run
+without any modification, but any attempts to use unsupported features are ignored.
+By using the Software adaptation, it is possible to run Qt Quick 2 applications on hardware and
+platforms that do not have \l{topics-graphics}{hardware-accelerated 3D graphics API} support.
The Software adaptation was previously known as the Qt Quick 2D Renderer. However, unlike the 2D
Renderer, this new, integrated version supports partial updates. This means that a full update
@@ -121,14 +122,9 @@ even though they are not visible.
\section2 Rendering Text
The text rendering with the Software adaptation is based on software rasterization and does not
-respond as well to transformations such as scaling, compared to when using OpenGL. The quality is
-similar to choosing \l [QML] {Text::renderType}{Text.NativeRendering} with \l [QML] {Text} items.
-
-\section2 Qt Multimedia VideoOutput
-
-The Qt Multimedia module's VideoOutput item is not supported with the Software adaptation. This
-is because VideoOutput uses the QVideoRendererControl item which requires custom QSGGeometryNode
-behavior, which is only present in the default OpenGL adaptation.
+respond as well to transformations such as scaling, compared to when using a hardware-accelerated
+3D graphics API. The quality is similar to choosing \l [QML] {Text::renderType}{Text.NativeRendering}
+with \l [QML] {Text} items.
*/
diff --git a/src/quick/doc/src/concepts/visualcanvas/scenegraph.qdoc b/src/quick/doc/src/concepts/visualcanvas/scenegraph.qdoc
index 30ccb9967e..050bf00f62 100644
--- a/src/quick/doc/src/concepts/visualcanvas/scenegraph.qdoc
+++ b/src/quick/doc/src/concepts/visualcanvas/scenegraph.qdoc
@@ -248,9 +248,9 @@ environment.
The non-threaded render loop is currently used by default on Windows with
OpenGL when not using the system's standard opengl32.dll, \macos with OpenGL,
-and Linux with some drivers. For the latter this is mostly a precautionary
-measure, as not all combinations of OpenGL drivers and windowing systems have
-been tested.
+WebAssembly, and Linux with some drivers. For the latter this is mostly a
+precautionary measure, as not all combinations of OpenGL drivers and windowing
+systems have been tested.
On macOS and OpenGL, the threaded render loop is not supported when building
with XCode 10 (10.14 SDK) or later, since this opts in to layer-backed views on
@@ -258,6 +258,10 @@ macOS 10.14. You can build with Xcode 9 (10.13 SDK) to opt out of
layer-backing, in which case the threaded render loop is available and used by
default. There is no such restriction with Metal.
+The threaded render loop is not supported on WebAssembly, since the web platform
+has limited support for using WebGL on other threads than the main thread, and
+limited support for blocking the main thread.
+
Even when using the non-threaded render loop, you should write your code as if
you are using the threaded renderer, as failing to do so will make the code
non-portable.
@@ -319,6 +323,20 @@ same time this is exactly what can cause trouble if vsync-based throttling is
not functioning as expected, because if what the render loop thinks is
happening is not matching reality, incorrect animation pacing will occur.
+\note Starting from Qt 6.5, the threaded render loop offers the possibility of
+opting in to another animation driver, based solely on the elapsed time
+(QElapsedTimer). To enable this, set the \c{QSG_USE_SIMPLE_ANIMATION_DRIVER}
+environment variable to a non-zero value. This has the benefits of not needing
+any of the infrastructure for falling back to a QTimer when there are multiple
+windows, not needing heuristics trying determine if vsync-based throttling is
+missing or broken, being compatible with any kind of temporal drifts in vsync
+throttling, and not being tied to the primary screen's refresh rate, thus
+potentially working better in multi-screen setups. It also drives render
+thread animations (the \l Animator types) correctly even if vsync-based
+throttling is broken or disabled. On the other hand, animations may be
+perceived as less smooth with this approach. With compatibility in mind, it is
+offered as an opt-in feature at the moment.
+
In summary, the \c threaded render loop is expected to provide smoother
animations with less stutter as long as the following conditions are met:
@@ -410,8 +428,10 @@ situations.
Remember however, that by design none of this helps render thread animations
(the \l Animator types). In the absence of vsync-based blocking,
-\l{Animator}{animators} will advance incorrectly, faster than expected, even
-when the workarounds are activated for regular \l{Animation}{animations}.
+\l{Animator}{animators} will advance incorrectly by default, faster than
+expected, even when the workarounds are activated for regular
+\l{Animation}{animations}. If this becomes an issue, consider using the
+alternative animation driver by setting \c{QSG_USE_SIMPLE_ANIMATION_DRIVER}.
\note Be aware that the rendering loop logic and event processing on the GUI
(main) thread is not necessarily unthrottled even if waiting for vsync is
@@ -450,23 +470,53 @@ presentation rate simply because there is no presenting of the frame happening.
This is optional, by default animations will advance based on the system timer.
-\section2 Mixing Scene Graph and the native graphics API
+\section2 Extending the Scene Graph with QRhi-based and native 3D rendering
+
+The scene graph offers three methods for integrating application-provided
+graphics commands:
+
+\list
+
+\li Issuing either \l{QRhi}-based or OpenGL, Vulkan, Metal, Direct3D commands
+directly before or after the scene graph's own rendering. This in effect
+prepends or appends a set of draw calls into the main render pass. No additional
+render target is used.
+
+\li Rendering to a texture and creating a textured node in the scene graph. This
+involves an additional render pass and render target.
+
+\li Issuing draw calls inline with the scene graph's own rendering by
+instantiating a QSGRenderNode subclass in the scene graph. This is similar to
+the first approach but the custom draw calls are effectively injected into the
+scene graph's command stream.
+
+\endlist
-The scene graph offers two methods for integrating application-provided
-graphics commands: by issuing OpenGL, Vulkan, Metal, etc. commands directly,
-and by creating a textured node in the scene graph.
+\section3 Underlay/overlay mode
By connecting to the \l QQuickWindow::beforeRendering() and \l
-QQuickWindow::afterRendering() signals, applications can make OpenGL calls
-directly into the same context as the scene graph is rendering to. With APIs
-like Vulkan or Metal, applications can query native objects, such as, the scene
-graph's command buffer, via QSGRendererInterface, and record commands to it as
-they see fit. As the signal names indicate, the user can then render content
-either under a Qt Quick scene or over it. The benefit of integrating in this
-manner is that no extra framebuffer nor memory is needed to perform the
-rendering, and a possibly expensive texturing step is eliminated. The downside
-is that Qt Quick decides when to call the signals and this is the only time the
-OpenGL application is allowed to draw.
+QQuickWindow::afterRendering() signals, applications can make \l QRhi or native
+3D API calls directly into the same context as the scene graph is rendering to.
+With APIs like Vulkan or Metal, applications can query native objects, such as,
+the scene graph's command buffer, via QSGRendererInterface, and record commands
+to it as they see fit. As the signal names indicate, the user can then render
+content either under a Qt Quick scene or over it. The benefit of integrating in
+this manner is that no extra render targets are needed to perform the rendering,
+and a possibly expensive texturing step is eliminated. The downside is that the
+custom rendering can only be issued either at the beginning or at the end of Qt
+Quick's own rendering. Using QSGRenderNode instead of the QQuickWindow signals
+can lift that restriction somewhat, but in either case care must be taken when
+it comes to 3D content and depth buffer usage since relying on depth testing and
+rendering with depth write enabled can easily create situations where the custom
+content and the Qt Quick content's depth buffer usage conflict with each other.
+
+From Qt 6.6 the \l QRhi APIs are considered semi-public, i.e. offered to the
+applications and documented, albeit with a limited compatibility guarantee. This
+allows creating portable, cross-platform 2D/3D rendering code by using the same
+graphics and shader abstractions the scene graph itself uses.
+
+The \l {Scene Graph - RHI Under QML} example gives an example on how to
+implement the underlay/overlay approach using \l QRhi.
The \l {Scene Graph - OpenGL Under QML} example gives an example on
how to use these signals using OpenGL.
@@ -480,36 +530,58 @@ how to use these signals using Metal.
The \l {Scene Graph - Vulkan Under QML} example gives an example on
how to use these signals using Vulkan.
-The other alternative, only available for OpenGL currently, is to create a
-QQuickFramebufferObject, render into it, and let it be displayed in the scene
-graph as a texture. The \l {Scene Graph - Rendering FBOs} example shows how
-this can be done.
-
-Graphics APIs other than OpenGL can also follow this approach, even though
-QQuickFramebufferObject does not currently support them. Creating and rendering
-to a texture directly with the underlying API, followed by wrapping and using
-this resource in a Qt Quick scene in a custom QQuickItem, is demonstrated in
-the \l {Scene Graph - Metal Texture Import} example. That example uses Metal,
-the concepts however apply to all other graphics APIs as well.
-
-\warning Starting with Qt 6.0, direct usage of the underlying graphics API must
-be enclosed by a call to \l QQuickWindow::beginExternalCommands() and \l
+Starting with Qt 6.0, direct usage of the underlying graphics API must be
+enclosed by a call to \l QQuickWindow::beginExternalCommands() and \l
QQuickWindow::endExternalCommands(). This concept may be familiar from \l
QPainter::beginNativePainting(), and serves a similar purpose: it allows the Qt
Quick Scene Graph to recognize that any cached state and assumptions about the
state within the currently recorded render pass, if there is one, are now
invalid, because the application code may have altered it by working directly
-with the underlying graphics API.
+with the underlying graphics API. This is not applicable and necessary when
+using \l QRhi.
+
+When mixing custom OpenGL rendering with the scene graph, it is important the
+application does not leave the OpenGL context in a state with buffers bound,
+attributes enabled, special values in the z-buffer or stencil-buffer or similar.
+Doing so can result in unpredictable behavior.
+
+The custom rendering code must be thread aware in the sense that it should not
+assume being executed on the GUI (main) thread of the application. When
+connecting to the \l QQuickWindow signals, the application should use
+Qt::DirectConnection and understand that the connected slots are invoked on the
+scene graph's dedicated render thread, if there is one.
+
+\section3 The texture-based approach
+
+The texture-based alternative is the most flexible approach when the application
+needs to have a "flattened", 2D image of some custom 3D rendering within the Qt
+Quick scene. This also allows using a dedicated depth/stencil buffer that is
+independent of the buffers used by the main render pass.
+
+When using OpenGL, the legacy convenience class QQuickFramebufferObject can be
+used to achieve this. QRhi-based custom renderers and graphics APIs other than
+OpenGL can also follow this approach, even though QQuickFramebufferObject does
+not currently support them. Creating and rendering to a texture directly with
+the underlying API, followed by wrapping and using this resource in a Qt Quick
+scene in a custom QQuickItem, is demonstrated in the following examples:
+
+\l {Scene Graph - RHI Texture Item} example.
+
+\l {Scene Graph - Vulkan Texture Import} example.
+
+\l {Scene Graph - Metal Texture Import} example.
-\warning When mixing OpenGL content with scene graph rendering, it is
-important the application does not leave the OpenGL context in a state
-with buffers bound, attributes enabled, special values in the z-buffer
-or stencil-buffer or similar. Doing so can result in unpredictable
-behavior.
+\section3 The inline approach
-\warning The custom rendering code must be thread aware in the sense that it
-should not assume being executed on the GUI (main) thread of the application.
+Using \l QSGRenderNode the custom draw calls are injected not at the beginning
+or the end of the recording of the scene graph's render pass, but rather during
+the scene graph's rendering process. This is achieved by creating a custom \l
+QQuickItem based by an instance of \l QSGRenderNode, a scene graph node that
+exists specifically to allow issuing graphics commands either via \l QRhi or a
+native 3D API such as OpenGL, Vulkan, Metal, or Direct 3D.
+The \l {Scene Graph - Custom QSGRenderNode} example gives a demonstration of
+this approach.
\section2 Custom Items using QPainter
@@ -1138,7 +1210,7 @@ with multiple windows.
From Qt 6.0 onwards, the default adaptation always renders via a graphics
abstraction layer, the Qt Rendering Hardware Interface (RHI), provided by the
- \l QtGui module. This means that, unlike Qt 5, no direct OpenGL calls are made
+ \l [QtGui]{Qt GUI} module. This means that, unlike Qt 5, no direct OpenGL calls are made
by the scene graph. Rather, it records resource and draw commands by using the
RHI APIs, which then translate the command stream into OpenGL, Vulkan, Metal,
or Direct 3D calls. Shader handling is also unified by writing shader code
@@ -1155,7 +1227,7 @@ with multiple windows.
\row
\li \c QSG_RHI_BACKEND
- \li \c vulkan, \c metal, \c opengl, \c d3d11
+ \li \c vulkan, \c metal, \c opengl, \c d3d11, \c d3d12
\li Requests the specific RHI backend. By default the targeted graphics API
is chosen based on the platform, unless overridden by this variable or the
equivalent C++ APIs. The defaults are currently Direct3D 11 for Windows,
@@ -1196,8 +1268,8 @@ with multiple windows.
\endcode
See QSGRendererInterface::GraphicsApi. The enum values \c OpenGL, \c Vulkan,
- \c Metal, \c Direct3D11 are equivalent in effect to running with \c
- QSG_RHI_BACKEND set to the equivalent string key.
+ \c Metal, \c Direct3D11, \c Direct3D12 are equivalent in effect to running
+ with \c QSG_RHI_BACKEND set to the equivalent string key.
All QRhi backends will choose the system default GPU adapter or physical
device, unless overridden by \c{QSG_RHI_PREFER_SOFTWARE_RENDERER} or a
@@ -1209,6 +1281,6 @@ with multiple windows.
as environment variables are available as C++ APIs in
QQuickGraphicsConfiguration. For example, setting \c QSG_RHI_DEBUG_LAYER and
calling
- \l{QQuickGraphicsConfiguration::setDebugLayerEnabled()}{setDebugLayerEnabled(true)}
+ \l{QQuickGraphicsConfiguration::setDebugLayer()}{setDebugLayer(true)}
are equivalent.
*/
diff --git a/src/quick/doc/src/dynamicview-tutorial.qdoc b/src/quick/doc/src/dynamicview-tutorial.qdoc
index 3a3f73a533..bb6c18b90c 100644
--- a/src/quick/doc/src/dynamicview-tutorial.qdoc
+++ b/src/quick/doc/src/dynamicview-tutorial.qdoc
@@ -30,6 +30,7 @@ directory.
\nextpage QML Dynamic View Ordering Tutorial 2 - Dragging View Items
\example tutorials/dynamicview/dynamicview1
+\examplecategory {User Interface Components}
We begin our application by defining a ListView, a model which will provide data to the view, and a
delegate which provides a template for constructing items in the view.
diff --git a/src/quick/doc/src/examples.qdoc b/src/quick/doc/src/examples.qdoc
index d49b718a26..84f2986722 100644
--- a/src/quick/doc/src/examples.qdoc
+++ b/src/quick/doc/src/examples.qdoc
@@ -6,7 +6,6 @@
\page qtquick-codesamples.html
\title Qt Quick Examples and Tutorials
\brief Building UIs with QML
-\ingroup all-examples
\ingroup qtquick
\keyword qtquick-samples
@@ -14,7 +13,7 @@ Qt includes several examples to demonstrate a particular usage. The examples
run as applications or as non-GUI examples in Qt Creator. Qt tutorials show
the step-by-step information and give insight to particular code snippets.
-This page lists the \l{Qt QML} and \l{Qt Quick} examples, however, many other
+This page lists the \l{Qt Qml} and \l{Qt Quick} examples, however, many other
\l{All Modules}{Qt modules} contain examples related to their QML API.
\section1 Running the Examples and Demos
@@ -60,7 +59,7 @@ steps such as use cases and introductory material. For more information about Qt
\b{Beginning with QML and Qt Quick}
\list
\li \l{First Steps with QML}
- \li \l{Getting Started Programming with Qt Quick}{Qt Quick Text Editor}
+ \li \l{Getting Started Programming with Qt Quick}{Alarms Application}
\li \l{Qt Design Studio: Your First UI}{Qt Design Studio Tutorials}
\li \l{QML Advanced Tutorial}{SameGame}
\endlist
@@ -81,11 +80,12 @@ steps such as use cases and introductory material. For more information about Qt
\section2 Extending QML
-The following tutorials show how a QML-based application can be combined with
-C++ code using the \l{Qt QML} module. For information about extending QML, visit
-the \l{Writing QML Extensions with C++} page.
-
-\annotatedlist{qmlextendingexamples}
+The following tutorials show how a QML-based application can be combined and
+exteneded with C++ code using the \l{Qt Qml} module.
+\list
+ \li \l {Writing QML Extensions with C++}
+ \li \l {Writing advanced QML Extensions with C++}
+\endlist
\section1 Examples
@@ -98,20 +98,18 @@ Creator.
\b{QML Types and Controls}
\list
\li \l{Qt Quick Controls - Gallery}{Controls Gallery}
- \li \l{Calendar Example}
\li \l{tableview/gameoflife}{TableView}
\li \l{Qt Quick Examples - Text}{Text and Fonts}
- \li \l{Qt Quick Examples - Toggle Switch}{Custom Toggle Switch}
\endlist
\enddiv
\div {class="doc-column"}
\b{Layouts and Views}
\list
\li \l{Qt Quick Layouts - Basic Example}
+ \li \l{Qt Quick Layouts - Responsive Layout Example}
\li \l{Qt Quick Examples - Positioners}{Positioners}
\li \l{Qt Quick Examples - Views}{Views}
\li \l{Qt Quick Examples - Window and Screen}{Windows and Screen}
- \li \l{Qt Quick Examples - Right to Left}{Right-to-Left and Text Layout}
\endlist
\enddiv
\div {class="doc-column"}
@@ -121,6 +119,15 @@ Creator.
\li \l{Qt Quick Examples - Animation}{Animation}
\li \l{Qt Quick Examples - Canvas}{Canvas API}
\li \l{Qt Quick Examples - Shader Effects}{Shader Effects}
+ \li \l{Qt Quick Examples - MultiEffect Test Bed}{MultiEffect}
+ \li \l{Qt Quick Examples - MultiEffect Item Switcher}{MultiEffect-based Item Transitions}
+ \endlist
+ \enddiv
+ \div {class="doc-column"}
+ \b{Shapes}
+ \list
+ \li \l{Qt Quick Examples - Shapes}{Shapes}
+ \li \l{Weather Forecast Example}{Weather Forecast}
\endlist
\enddiv
\enddiv
@@ -130,15 +137,13 @@ Creator.
\b{Keyboard, Focus, and Touch}
\list
\li \l{Qt Quick Examples - Key Interaction}{Key Interaction}
- \li \l{Qt Quick Examples - MouseArea}{MouseArea}
+ \li \l{Qt Quick Examples - Pointer Handlers}{Pointer Handlers}
\endlist
\enddiv
\div {class="doc-column"}
\b{System and Events}
\list
- \li \l{Qt Quick Examples - Threading}{Threading}
\li \l{Qt Quick Examples - Accessibility}{Accessibility}
- \li \l{Qt Quick Examples - externaldraganddrop}{External Drag and Drop}
\li \l{Qt Quick Examples - Drag and Drop}{Drag and Drop}
\li \l{Qt Quick Examples - Item Variable Refresh Rate}{Item Variable Refresh Rate}
\endlist
@@ -147,16 +152,37 @@ Creator.
\b{Scene Graph}
\list
\li \l{Scene Graph - Custom Material}{Custom Material}
+ \li \l{Scene Graph - RHI Under QML}{Portable QRhi-based 3D rendering as a scene underlay}
+ \li \l{Scene Graph - RHI Texture Item}{Displaying a QRhi-rendered image in a QQuickItem}
+ \li \l{Scene Graph - Custom QSGRenderNode}{Implementing a QRhi-based QSGRenderNode}
+ \li \l{QQuickRenderControl RHI Example}{Redirecting Qt Quick rendering into a QRhiTexture}
\li \l{Scene Graph - Two Texture Providers}{Texture Providers and Materials}
\li \l{Scene Graph - Custom Geometry}{Custom Geometry}
\li \l{Scene Graph - Graph}{Graph}
- \li \l{Scene Graph - OpenGL Under QML}{OpenGL Under QML}
- \li \l{Scene Graph - Direct3D 11 Under QML}{Direct3D 11 Under QML}
- \li \l{Scene Graph - Vulkan Under QML}{Vulkan Under QML}
- \li \l{Scene Graph - Vulkan Texture Import}{Vulkan Texture Import}
- \li \l{Scene Graph - Metal Under QML}{Metal Under QML}
- \li \l{Scene Graph - Metal Texture Import}{Metal Texture Import}
- \li \l{Scene Graph - Rendering FBOs}{Rendering to OpenGL FBOs}
+ \endlist
+ \enddiv
+\enddiv
+
+\div {class="multi-column"}
+ \div {class="doc-column"}
+ \b{Extending the Scene Graph using native 3D APIs}
+ \list
+ \li \l{Scene Graph - Vulkan Under QML}{Vulkan-based 3D rendering as a scene underlay}
+ \li \l{Scene Graph - Vulkan Texture Import}{Implementing a custom QQuickItem that displays a native Vulkan image}
+ \li \l{Scene Graph - Metal Under QML}{Metal-based 3D rendering as a scene underlay}
+ \li \l{Scene Graph - Metal Texture Import}{Implementing a custom QQuickItem that displays a native Metal texture}
+ \li \l{Scene Graph - Direct3D 11 Under QML}{Direct3D 11-based rendering as a scene underlay}
+ \li \l{Scene Graph - OpenGL Under QML}{OpenGL-based rendering as a scene underlay}
+ \li \l{QQuickRenderControl OpenGL Example}{Redirecting Qt Quick rendering into an OpenGL texture}
+ \li \l{QQuickRenderControl D3D11 Example}{Redirecting Qt Quick rendering into a Direct 3D texture}
+ \endlist
+ \enddiv
+ \div {class="doc-column"}
+ \b{Adding Qt Quick scenes in QWidget applications}
+ \list
+ \li \l{Qt Quick Widgets Example}{Using QQuickWidget}
+ \li \l{QQuickWidget - QQuickView Comparison Example}{QQuickWidget - QQuickView Comparison (OpenGL)}
+ \li \l{Qt Quick Examples - Embedded in Widgets}{Embedding a QQuickView as Native Window}
\endlist
\enddiv
\enddiv
diff --git a/src/quick/doc/src/guidelines/qtquick-bestpractices.qdoc b/src/quick/doc/src/guidelines/qtquick-bestpractices.qdoc
index 2e2fc05aac..1934be6f26 100644
--- a/src/quick/doc/src/guidelines/qtquick-bestpractices.qdoc
+++ b/src/quick/doc/src/guidelines/qtquick-bestpractices.qdoc
@@ -6,6 +6,7 @@
\title Best Practices for QML and Qt Quick
\brief Lists best practices for working with QML and Qt Quick.
\ingroup best-practices
+\ingroup explanations-programminglanguages
Despite all of the benefits that QML and Qt Quick offer, they can be
challenging in certain situations. The following sections elaborate on some of
@@ -28,11 +29,16 @@ options that align with the latest UI design trends. If these UI controls do not
satisfy your application's needs, only then it is recommended to create a
custom control.
+You can use the controls when you design UIs in Qt Design Studio. In addition,
+it provides timeline-based animations, visual effects, layouts, and a
+live-preview for prototyping applications.
\section2 Related Information
\list
\li \l{Qt Quick Controls}
+\li \l{Customizing Qt Quick Controls}
\li \l{Qt Quick}
+\li \l{Qt Design Studio Manual}
\endlist
\omit
@@ -88,12 +94,17 @@ qt_add_qml_module(my_module
All QML files listed under \c {QML_FILES} will automatically get compiled \l {Ahead-of-Time Compilation}{ahead of time}.
+You should keep the QML files in the same directory as the CMakeLists.txt with
+the qt_add_qml_module. Otherwise their \l{The Implicit Import}{implicit imports}
+will be different from the \l{QML Modules} they belong to. This is a frequent
+source of mistakes.
+
\section2 Related Information
\list
\li \l{The Qt Resource System}
\endlist
-\section1 Separate UI from Logic
+\section1 Separate UI from Business Logic
One of the key goals that most application developers want to achieve is to
create a maintainable application. One of the ways to achieve this goal is
@@ -109,8 +120,8 @@ reasons why an application's UI should be written in QML:
\li JavaScript can easily be used in QML to respond to events.
\endlist
-Being a strongly typed language, C++ is best suited for an application's logic.
-Typically, such code performs tasks such as complex calculations
+Being a strongly typed language, C++ is best suited for an application's
+business logic. Typically, such code performs tasks such as complex calculations
or data processing, which are faster in C++ than QML.
Qt offers various approaches to integrate QML and C++ code in an application.
@@ -154,6 +165,22 @@ see \l {Choosing the Correct Integration Method Between C++ and QML}.
\li \l{Qt Quick Controls - Chat Tutorial}{Chat application tutorial}
\endlist
+\section1 Using Qt Design Studio
+
+Qt Design Studio uses UI files that have the filename extension \e {.ui.qml}
+to separate the visual parts of the UI from the UI logic you implement in
+\e {.qml} files. You should edit UI files only in the \uicontrol {2D} view in
+Qt Design Studio. If you use some other tool to add code that Qt Design Studio
+does not support, it displays error messages. Fix the errors to enable visual
+editing of the UI files again. Typically, you should move the unsupported code
+to a \e {.qml} file.
+
+\section2 Related Information
+
+\list
+ \li \l{Qt Design Studio: UI Files}
+\endlist
+
\section1 Using Qt Quick Layouts
Qt offers Qt Quick Layouts to arrange Qt Quick items visually in a layout.
@@ -228,7 +255,7 @@ property MyMenu optionsMenu
\section1 Performance
For information on performance in QML and Qt Quick,
-see \l {Performance Considerations And Suggestions}.
+see \l {QML Performance Considerations And Suggestions}.
\section1 Prefer Declarative Bindings Over Imperative Assignments
diff --git a/src/quick/doc/src/guidelines/qtquick-tool-qmllint.qdoc b/src/quick/doc/src/guidelines/qtquick-tool-qmllint.qdoc
deleted file mode 100644
index 0a9d6dbc58..0000000000
--- a/src/quick/doc/src/guidelines/qtquick-tool-qmllint.qdoc
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright (C) 2021 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
-
-/*!
-\page qtquick-tool-qmllint.html
-\title qmllint
-\brief A tool for verifying the syntax of QML files and warning about
-anti-patterns.
-
-\e qmllint is a tool shipped with Qt, that verifies the syntatic validity of
-QML files.
-It also warns about some QML anti-patterns. If you want to disable a specific
-warning type, you can find the appropriate flag for doing so by passing
-\c{--help} on the command line.
-
-By default, some issues will result in warnings that will be printed and result
-in a non-zero exit code.
-Minor issues however (such as unused imports) are just informational messages
-by default and will not affect the exit code.
-qmllint is very configurable and allows for disabling warnings or changing how
-they are treated.
-Users may freely turn any issue into a warning, informational message, or
-disable them outright.
-
-qmllint warns about:
-\list
- \li Unqualified accesses of properties
- \li Usage of signal handlers without a matching signal
- \li Usage of with statements in QML
- \li Issues related to compiling QML code
- \li Unused imports
- \li Deprecated components and properties
- \li And many other things
-\endlist
-
-\note In order for qmllint to work properly, it requires type information.
-That information is provided by QML modules in the import paths.
-The current directory, as well as the import paths for Qt's built-in types,
-are used as import paths by default.
-To add more import paths not included in the default,
-add them via the \c{-I} flag.
-
-To get an overview and explanation of all available command line options, run \c{qmllint --help}.
-
-\section2 Compiler warnings
-
-qmllint can warn you about code that cannot be compiled by \l{qmlsc}.
-
-These warnigs are not enabled by default. In order to enable them specify
-\c{--compiler warning} or adjust your settings file accordingly.
-
-\section2 Marking components and properties as deprecated
-
-qmllint allows you to mark both properties and components as deprecated:
-
-\code
-@Deprecated { reason: "Use NewCustomText instead" }
-Text {
- @Deprecated { reason: "Use newProperty instead" }
- property int oldProperty
- property int newProperty
- Component.onCompleted: console.log(oldProperty); // Warning: XY.qml:8:40: Property "oldProperty" is deprecated (Reason: Use newProperty instead)
-}
-\endcode
-
-Deprecation warnings for components will be shown every time the component is created.
-
-\section2 Disabling warnings inline
-
-You may at any point disable warnings temporarily in a file using \c{// qmllint
-disable}.
-
-You can do this at the end of a line when a single line produces warnings:
-
-\code
-Item {
- property string foo
- Item {
- property string bar: foo // qmllint disable unqualified
- }
-}
-\endcode
-
-Alternatively you can disable comments for a block of lines by putting the
-comment in a line only containing \c{// qmllint disable}, ending the block with
-\c{// qmllint enable}:
-
-\code
-Item {
- property string foo
- Item {
- // qmllint disable unqualified
- property string bar: foo
- property string bar2: foo
- // qmllint enable unqualified
- }
-}
-\endcode
-
-qmllint interprets all single line comments starting with \c {qmllint} as
-directives. Thus you may not start a comment that way unless you wish to enable
-or disable warnings.
-
-\note As done in the examples above it is preferable to explicitly specify the
-warning or a list of warnings you want to disable instead of disabling all
-warnings. This can be done by simply listing warning categories after \c{qmllint disable} (the names are
-the same as the options listed in \c{--help}).
-
-\section2 Settings
-
-In addition to passing command-line options, you can also
-configure qmllint via a settings file.
-The command line \c{--write-defaults} will generate one for you.
-
-Setting files are named \c{.qmllint.ini} and look like this:
-
-\quotefile qmllint/config.ini
-
-Warning levels may be set to \c{info}, \c{warning} or \c{disable} just as with
-command line options.
-
-qmllint will automatically look for a settings file at the location of the qml
-file that is being linted.
-It also looks through all parent directories to find this file and
-automatically applies the settings therein. You can disable this behavior by
-using \c{--ignore-settings}.
-You may always override these defaults by specifying command line parameters
-that take precedence over the warning levels in settings.
-
-\section2 Scripting
-
-qmllint can write or output JSON via the \c{--json <file>} option which will return valid JSON
-with warning messages, file and line location of warnings, and their severity
-level. Use the special filename '-' to write to stdout instead of a file.
-This can be used to more easily integrate qmllint in your pre-commit hooks or
-CI testing.
-
-\sa {Type Description Files}{qmltypes}
-\sa {QtQuick Tools and Utilities}{qtquick-tools-and-utilities}
-*/
diff --git a/src/quick/doc/src/guidelines/qtquick-toolsnutilities.qdoc b/src/quick/doc/src/guidelines/qtquick-toolsnutilities.qdoc
index 50b929e0ed..17f6c31238 100644
--- a/src/quick/doc/src/guidelines/qtquick-toolsnutilities.qdoc
+++ b/src/quick/doc/src/guidelines/qtquick-toolsnutilities.qdoc
@@ -24,6 +24,12 @@ UIs using simple drag-n-drop gestures that most designers are familiar with.
It offers UI elements from the Qt Quick and Qt Quick Controls modules, as well
as integration for custom UI elements.
+\section1 Qt Quick Effect Maker (QQEM)
+
+\l{\QQEM} is a tool for creating shader effects for Qt Quick with
+high productivity and performance. You can run Qt Quick Effect Maker as a
+standalone tool.
+
\section1 QML Debugger
The \l{Qt Creator: QML Debugger}{QML Debugger} is a very useful utility that
@@ -69,7 +75,7 @@ tests are setup, UI tests are a lot easier to run.
\section1 qmllint
-\l{qtquick-tool-qmllint.html}{qmllint} is a tool shipped with Qt, that verifies
+\l{qmllint Reference}{qmllint} is a tool shipped with Qt, that verifies
the syntatic validity of QML files. It also warns about some QML anti-patterns.
If you want to disable a specific warning type, you can find the appropriate
flag for doing so by passing \c{--help} on the command line.
@@ -98,7 +104,17 @@ all the available options.
The Qt Quick Compiler consist of two components:
\list
- \li \l {QML Type Compiler}
- \li \l {QML Script Compiler}
+ \li \l {QML type compiler}
+ \li \l {QML script compiler}
\endlist
+
+\section1 \QMLLS
+
+\l{\QMLLS Reference}{\QMLLS} is a tool shipped with Qt that helps you edit
+QML code in your favorite (LSP-compatible) editor.
+
+\section1 SVG to QML converter [tech preview]
+
+The \l{svgtoqml} tool converts an SVG document to a QML file that can be used as a component.
+
*/
diff --git a/src/quick/doc/src/includes/item.qdocinc b/src/quick/doc/src/includes/item.qdocinc
index 4cb2652bbf..733589be5d 100644
--- a/src/quick/doc/src/includes/item.qdocinc
+++ b/src/quick/doc/src/includes/item.qdocinc
@@ -3,6 +3,9 @@
The following properties of the item are used in the mapping:
\l x, \l y, \l scale, \l rotation, \l transformOrigin, and \l [QML]{Item::}{transform}.
+If the items are part of different scenes, the mapping includes
+the relative position of the two scenes.
+
//! [mapping]
@@ -13,3 +16,4 @@ accept the event if you reimplement this function. If you don't accept the
event, call \c event->ignore().
//! [accepting-events]
+
diff --git a/src/quick/doc/src/includes/layout.qdocinc b/src/quick/doc/src/includes/layout.qdocinc
index 723fbc515a..a36f05ee4f 100644
--- a/src/quick/doc/src/includes/layout.qdocinc
+++ b/src/quick/doc/src/includes/layout.qdocinc
@@ -14,5 +14,7 @@
\li \l{Layout::rightMargin}{Layout.rightMargin}
\li \l{Layout::topMargin}{Layout.topMargin}
\li \l{Layout::bottomMargin}{Layout.bottomMargin}
+\li \l{Layout::horizontalStretchFactor}{Layout.horizontalStretchFactor}
+\li \l{Layout::verticalStretchFactor}{Layout.verticalStretchFactor}
//! [attached-properties]
diff --git a/src/quick/doc/src/internal/deliverMatchingPointsToItem.puml b/src/quick/doc/src/internal/deliverMatchingPointsToItem.puml
new file mode 100644
index 0000000000..6a0fa04717
--- /dev/null
+++ b/src/quick/doc/src/internal/deliverMatchingPointsToItem.puml
@@ -0,0 +1,14 @@
+\startuml
+partition "deliverMatchingPointsToItem" {
+ :localizePointerEvent;
+ :QQuickItemPrivate::handlePointerEvent;
+ repeat :loop over extra->pointerHandlers;
+ :QQuickPointerHandler::handlePointerEvent;
+ :wantsPointerEvent;
+ repeat :loop over QEventPoints;
+ :wantsEventPoint;
+ repeat while (more?) is (yes)
+ :handlePointerEventImpl;
+ repeat while (more?) is (yes)
+}
+\enduml
diff --git a/src/quick/doc/src/internal/ideal-pointer-event-delivery-single-drag.dox b/src/quick/doc/src/internal/ideal-pointer-event-delivery-single-drag.dox
new file mode 100644
index 0000000000..4a8b8eef43
--- /dev/null
+++ b/src/quick/doc/src/internal/ideal-pointer-event-delivery-single-drag.dox
@@ -0,0 +1,242 @@
+/*! \internal
+ \page qq-ideal-pointer-event-delivery-single-drag Dragging one DragHandler with one touchpoint
+ \tableofcontents
+
+ <a href="https://doc.qt.io/qt-6/qtquick-input-topic.html">Multi-touch</a>
+ is intended to be a strong feature in Qt Quick, so let's run this example
+ on a touchscreen:
+
+ \snippet pointerHandlers/pinchAndDragHandlers.qml entire
+
+ The intended behavior is that we have three Rectangles that can be dragged,
+ and you can alternatively perform a pinch gesture on the parent Rectangle
+ to scale and rotate it. The object instances involved look like this:
+
+ \dotfile pinchAndDragHandlers.dot "pinch and drag handlers"
+
+ (In these diagrams, ℚ is a shortcut for QQuick, to save space.
+ ResizeItemToWindow comes from \c qtdeclarative/tools/qml/ResizeItemToWindow.qml
+ which is a resource in the
+ <a href="https://doc.qt.io/qt-6/qtquick-qml-runtime.html">qml executable</a>
+ which wraps our top-level Rectangle into a Window.)
+
+ \section qq-ideal-pointer-event-delivery-press-draghandler-prep Touch press on a DragHandler: preparation
+
+ Let's start with the scenario that you attempt to drag one Rectangle
+ with one finger. A QTouchEvent arrives, it contains a single QEventPoint
+ representing the single finger, and we have to decide which items and
+ handlers we're going to visit.
+
+ \image html pinchAndDragHandlers-singlePressPrep.svg "touch press event delivery: preparation"
+
+ Since Qt 5.8 (change ccc5c54602821761a2f1a42c4bc473afd53439c9), we stopped
+ doing ad-hoc recursive delivery of touch and mouse events: we wanted to
+ ensure that delivery is deterministic (in spite of what user code may do to
+ the parent hierarchy during delivery), so we first build a list of Items to
+ visit, in QQuickDeliveryAgentPrivate::pointerTargets() (which is recursive
+ itself). This is somewhat expensive, but fortunately we only need to do
+ that when handling the event that begins a gesture, such as a press event.
+ A press event is a pointer event in which \e any QEventPoint has the
+ \c Pressed QEventPoint::state.
+
+ But how do we decide which items are relevant and need to be visited?
+ First, the QEventPoint must fall within the item's bounds, so we need to
+ call QQuickItem::mapFromScene() to localize from the scene (window)
+ coordinates to item coordinates, and then QQuickItem::contains() to check
+ whether it's inside. (QQuickItem::contains() is virtual so that QQuickShape
+ can be non-rectangular; also, any Item can have a
+ QQuickItem::containmentMask() to declare non-rectangular bounds.) Then, we
+ call QQuickItemPrivate::anyPointerHandlerWants() which calls
+ QQuickPointerHandler::wantsEventPoint() on each of the item's pointer
+ handlers: if any handler wants the eventpoint, we need to visit that item.
+ Otherwise, if QQuickItem::acceptTouchEvents() returns false, we do \e not
+ need to visit that item. Thus, pointerTargets() pre-visits all items in the
+ scene to build the list of potential targets.
+
+ \section qq-ideal-pointer-event-delivery-press-draghandler Touch press on a DragHandler: delivery to targets
+
+ After building the list, we are prepared to begin actual delivery of the
+ press event. QQuickDeliveryAgentPrivate::deliverPressOrReleaseEvent() loops
+ over \c targetItems and calls
+ QQuickDeliveryAgentPrivate::deliverMatchingPointsToItem(). (Parent-item
+ filtering could have intercepted it before that; but as stated, we're
+ neglecting that complication for now.)
+
+ \image html pinchAndDragHandlers-singlePressDelivery.svg "touch press event actual delivery"
+
+ For each item in \c targetItems, again we need to call mapFromScene() and
+ set QEventPoint::position() to item-local coordinates:
+ QQuickDeliveryAgentPrivate::localizePointerEvent() takes care of that.
+ We always let Pointer Handlers handle the event before the Item itself
+ (because this allows a handler to override or augment behavior that a C++
+ QQuickItem subclass has in its QQuickItem::touchEvent() function: another
+ complication that we're neglecting for now). The implementation for that
+ is in QQuickItemPrivate::handlePointerEvent(): it simply loops over any
+ handlers that are found in the list QQuickItemPrivate::ExtraData::pointerHandlers
+ and calls QQuickPointerHandler::handlePointerEvent() on each of those.
+ That's not a virtual function; but it calls wantsPointerEvent()
+ again, and then handlePointerEventImpl() which \e is virtual.
+
+ PinchHandler would get the event first if it was relevant, because
+ pointerTargets() was a preorder traversal, so parents come before children
+ in the \c targetItems list. But QQuickMultiPointHandler::wantsPointerEvent()
+ has already returned false, because QQuickMultiPointHandler::eligiblePoints()
+ has only found one point, and QQuickMultiPointHandler::minimumPointCount()
+ is 2 by default. (You might be wondering, what if the user presses a
+ second finger later to start the pinch gesture? We'll get to that below.)
+ So it can be skipped; next in \c targetItems should be a Rectangle whose
+ bounds contain QEventPoint::position() \e and that has a DragHandler.
+ By default, one point is enough for a DragHandler: its inherited
+ QQuickMultiPointHandler::wantsPointerEvent() has already returned \c true,
+ and QQuickMultiPointHandlerPrivate::currentPoints is already storing
+ information about the QEventPoints that it wants to handle.
+ (QEventPoint::id() is guaranteed to remain constant during one gesture:
+ once pressed, the same finger keeps manipulating the same QEventPoint.
+ In \c currentPoints[0], QQuickHandlerPoint::id() remembers it.)
+ So QQuickDragHandler::handlePointerEventImpl() can immediately iterate
+ \c currentPoints, find the QEventPoint that has the same ID; and then
+ it calls QQuickPointerHandler::setPassiveGrab(), because DragHandler
+ needs to monitor the position of that point. The drag gesture will not
+ begin until the point is dragged a distance in pixels greater than
+ QStyleHints::startDragDistance(), and it's not appropriate for DragHandler
+ to take the exclusive grab of that touchpoint until it's sure the user
+ really means to drag. (What if the same Rectangle also had a TapHandler?
+ The user could either drag, or tap without dragging; but at the time of the
+ press, it's ambiguous, so both handlers would need their own grabs, to express
+ interest in monitoring that touchpoint.) But without any grab, the handler
+ would not be visited again when the next event occurs: a touchpoint
+ movement or release.
+
+ We've omitted details about the meaning of QEventPoint::accepted() and
+ QEvent::accepted() flags. Pointer handlers need to take grabs explicitly:
+ that helps to remove ambiguity about the consequences of the \c accepted flags.
+
+ \section qq-ideal-pointer-event-delivery-move-draghandler Touch move on a DragHandler: delivery to grabber
+
+ \image html pinchAndDragHandlers-drag-one-rect.png "dragging one rectangle via touch"
+
+ So we're done handling the press; now let's try to start dragging.
+
+ Let's say the user's finger quickly moves far enough on the touchscreen to
+ generate a single QTouchEvent with a delta greater than the drag threshold.
+
+ Again, QGuiApplicationPrivate::processTouchEvent() handles the next QPA
+ touch event (QWindowSystemInterfacePrivate::TouchEvent). For each
+ touchpoint (for each finger being held down), it calls
+ QPointingDevicePrivate::pointById() to retrieve the
+ QPointingDevicePrivate::EventPointData that was stored previously when the
+ press event was delivered, and updates its stored state, including the
+ QEventPoint instance, to be current for this incoming move event.
+ QEventPoint::globalPressPosition() is not updated though: it continues to
+ hold the position at which the press occurred; therefore, any object that
+ ends up handing the moving point can check to see how far it moved since
+ press. Likewise, QEventPoint::pressTimestamp() holds the time at which it
+ was pressed.
+
+ \image html pinchAndDragHandlers-singleMoveDelivery.svg "touch move event delivery"
+
+ Another QTouchEvent instance is stack-allocated, with type
+ QEvent::TouchUpdate, in which \c point(0) is a QEventPoint (with state
+ QEventPoint::Updated) with QEventPoint::scenePosition() being the current
+ finger position in the window, while QEventPoint::scenePressPosition()
+ remembers where it was pressed during the previous press event. It's sent
+ to the application via QGuiApplication::sendSpontaneousEvent(), then to
+ ① QQuickWindow::event(), which dispatches to ② QQuickDeliveryAgent::event().
+ ③ QQuickDeliveryAgentPrivate::deliverPointerEvent() calls
+ ④ QQuickDeliveryAgentPrivate::deliverUpdatedPoints(), which (among other
+ things) iterates the QEventPoints, and for each of those, iterates the
+ passive grabbers in QPointingDevicePrivate::EventPointData::passiveGrabbers
+ and calls ⑤ QQuickDeliveryAgentPrivate::deliverToPassiveGrabbers(). It uses
+ ⑥ QQuickDeliveryAgentPrivate::localizePointerEvent() to ⑦ map
+ QEventPoint::position() to the passive-grabbing DragHandler's parent item's
+ coordinate system, and calls ⑧ QQuickPointerHandler::handlePointerEvent().
+ ⑨ QQuickMultiPointHandler::wantsPointerEvent() returns \c true because all
+ the same QQuickMultiPointHandlerPrivate::currentPoints still exist in this
+ QTouchEvent (with no points left over); so
+ ⑩ QQuickDragHandler::handlePointerEventImpl() is called. For each point, it
+ calculates the movement delta \c (scenePosition() - scenePressPosition());
+ ⑪ QQuickPointerHandlerPrivate::dragOverThreshold() checks whether it's moved
+ far enough to activate dragging. (If multiple points were being dragged,
+ handlePointerEventImpl() would also check whether they are all being
+ dragged in approximately the same direction.) It did move far enough, and
+ now DragHandler knows it should take responsibility for this gesture:
+ apparently the user is really trying to drag its parent item, the
+ Rectangle. It calls ⑫ QQuickMultiPointHandler::grabPoints() to try to take
+ the exclusive grab. Nothing is interfering with that, so the attempt
+ succeeds and returns \c true; therefore, it's ok to call
+ ⑬ QQuickPointerHandler::setActive(), which triggers
+ ⑭ QQuickDragHandler::onActiveChanged(), which updates some internal state
+ etc.; and then ⑮ emits the activeChanged() signal. In our example, the
+ Rectangle has a binding to ⑯ change color when the DragHandler becomes
+ active. And since by default, DragHandler's \c target is the same as its
+ \c parent, QQuickDragHandler::handlePointerEventImpl() ends with a call to
+ ⑰ QQuickMultiPointHandler::moveTarget(). That uses QMetaProperty::write()
+ to ⑱ change the Rectangle's \c x and \c y properties; the reason we do it
+ that way is in case property value interceptors (BoundaryRule or Behavior)
+ are in use. And so the Rectangle moves as far as the finger is dragged.
+
+ \section qq-ideal-pointer-event-delivery-release-draghandler Touch release: delivery to grabber
+
+ Now let's say there's a QPA event with
+ QWindowSystemInterface::TouchPoint::state being QEventPoint::Released.
+
+ \image html pinchAndDragHandlers-singleReleaseDelivery.svg "touch release event delivery"
+
+ It's processed like the touch move: the persistent QEventPoint is updated
+ with current values again, and another QTouchEvent instance is
+ stack-allocated, with type QEvent::TouchEnd, and ① sent to the window and ②
+ the delivery agent. When it gets to ③ QQuickDeliveryAgentPrivate::deliverPointerEvent(),
+ ④ deliverUpdatedPoints() is called first (same as for the move). As usual,
+ the event is not given to the item or its handlers until it's been ⑤
+ localized to the item's coordinate system.
+
+ ⑥ QQuickPointerHandler::handlePointerEvent() calls
+ ⑦ QQuickMultiPointHandler::wantsPointerEvent(), which is able to see that the
+ point it's tracking (in QQuickMultiPointHandlerPrivate::currentPoints) is
+ no longer eligible because it's been released; so it calls
+ ⑧ QQuickPointerHandler::setActive() with \c false immediately, which calls
+ ⑨ onActiveChanged() and emits the ⑩ activeChanged signal. (Thus our Rectangle
+ ⑪ changes its color again.) QQuickPointerHandler::handlePointerEvent() then
+ calls QPointerEvent::setExclusiveGrabber() with \c nullptr to give up its
+ exclusive grab. ⑫ QPointingDevice::grabChanged() is emitted.
+ QQuickDeliveryAgentPrivate::onGrabChanged() handles that signal, and calls
+ ⑬ QQuickDragHandler::onGrabChanged(), which has minimal consequences in this
+ case. (QQuickPointerHandler::onGrabChanged() calls
+ QQuickPointerHandler::setActive() with \c false again: it's a failsafe that
+ some other scenarios rely on.)
+
+ \section qq-ideal-pointer-event-delivery-touch-summary Touch delivery activity diagrams
+
+ So let's generalize the functionality we've covered so far.
+ As we'll see later, mouse events are treated a bit differently;
+ but ideally it would be the same: a mouse event is just a QPointerEvent
+ that comes from a different device, containing only one QEventPoint,
+ just like our single-finger touch event.
+
+ A begin (press) event goes to deliverPressOrReleaseEvent(), and then
+ if the QEventPoints weren't all accepted, it goes to deliverUpdatedPoints().
+
+ An update (move) event goes to deliverUpdatedPoints() only.
+
+ An end (release) event goes to deliverUpdatedPoints() and then
+ deliverPressOrReleaseEvent().
+
+ \startuml
+ !include ideal-pointer-event-delivery.puml
+ \enduml
+
+ QQuickDeliveryAgentPrivate::deliverMatchingPointsToItem() is called from
+ two places (deliverPressOrReleaseEvent() and deliverUpdatedPoints()), so
+ it's shown in a separate activity diagram:
+
+ \startuml
+ !include deliverMatchingPointsToItem.puml
+ \enduml
+
+ In conclusion, we've seen the details of touch event dispatching for one
+ short drag gesture to one DragHandler. In practice, Pointer Handlers are
+ still not the most common way to handle pointer events (even if we'd like
+ to end up there eventually): there are a lot of legacy QQuickItem
+ subclasses that do their event handling by overriding virtual functions
+ rather than by having handlers added. But let's save that for later.
+*/
diff --git a/src/quick/doc/src/internal/ideal-pointer-event-delivery.dox b/src/quick/doc/src/internal/ideal-pointer-event-delivery.dox
new file mode 100644
index 0000000000..15d96b0e10
--- /dev/null
+++ b/src/quick/doc/src/internal/ideal-pointer-event-delivery.dox
@@ -0,0 +1,22 @@
+/*! \internal
+ \mainpage Qt Quick Pointer Event Delivery
+
+ QPointerEvent instances are stack-allocated in
+ QGuiApplicationPrivate::processMouseEvent(),
+ QGuiApplicationPrivate::processTouchEvent() etc., and sent to the
+ application via QCoreApplication::sendSpontaneousEvent() (taking QWindow
+ and QEvent pointer arguments). If the window is a QQuickWindow, the QTouchEvent
+ arrives to QQuickWindow::event() which then dispatches to the
+ QQuickDeliveryAgent. QQuickDeliveryAgent contains much of the event
+ delivery code. In fact, it's quite complex, for legacy reasons such as
+ touch->mouse synthesis in three possible layers, handling events in
+ QQuickItem subclasses in C++, event compression, multiple kinds of event
+ filtering, drag-and-drop, dealing with popup menus and so on; but let's
+ start with the ideal case: no synthesis, no filtering, no popups, and all
+ events are handled in
+ <a href="https://doc.qt.io/qt-6/qtquickhandlers-index.html">Pointer Handlers</a>.
+
+ Here are some "ideal" scenarios:
+
+ - \subpage qq-ideal-pointer-event-delivery-single-drag
+*/
diff --git a/src/quick/doc/src/internal/ideal-pointer-event-delivery.puml b/src/quick/doc/src/internal/ideal-pointer-event-delivery.puml
new file mode 100644
index 0000000000..1d730b6f34
--- /dev/null
+++ b/src/quick/doc/src/internal/ideal-pointer-event-delivery.puml
@@ -0,0 +1,55 @@
+\startuml
+start
+:QGuiApplicationPrivate::process[Mouse|Touch|Tablet]Event();
+:QGuiApplication::sendSpontaneousEvent();
+:ℚWindow::event();
+:ℚDeliveryAgent::event();
+partition ℚDeliveryAgentPrivate::deliverPointerEvent() {
+ if (isBeginEvent()) then (yes)
+ partition "deliverPressOrReleaseEvent()" {
+ repeat :loop over QEventPoints;
+ :ℚDeliveryAgentPrivate::pointerTargets();
+ repeat while (more?) is (yes)
+ ->no;
+ repeat :loop over targetItems;
+ :**deliverMatchingPointsToItem()**;
+ repeat while (more?) is (yes)
+ ->no;
+ }
+ endif
+ if (allUpdatedPointsAccepted()) then (no)
+ partition "deliverUpdatedPoints()" {
+ repeat :loop over exclusive grabbers;
+ if (grabber type?) then (pointer handler)
+ :ℚPointerHandler::handlePointerEvent();
+ else (Item)
+ :**deliverMatchingPointsToItem()**;
+ endif
+ repeat while (more grabbers?) is (yes)
+ repeat :loop over QEventPoints;
+ partition "deliverToPassiveGrabbers()" {
+ repeat :loop over passive grabbers;
+ if (grabber type?) then (pointer handler)
+ :ℚPointerHandler::handlePointerEvent();
+ else (Item)
+ :QCoreApplication::sendEvent(item, event);
+ endif
+ repeat while (more grabbers?) is (yes)
+ }
+ repeat while (more points?) is (yes)
+ }
+ endif
+ if (isEndEvent()) then (yes)
+ partition "deliverPressOrReleaseEvent()" {
+ repeat :loop over QEventPoints;
+ :ℚDeliveryAgentPrivate::pointerTargets();
+ repeat while (more?) is (yes)
+ ->no;
+ repeat :loop over targetItems;
+ :**deliverMatchingPointsToItem()**;
+ repeat while (more?) is (yes)
+ }
+ endif
+}
+stop
+\enduml
diff --git a/src/quick/doc/src/internal/pinchAndDragHandlers-singleMoveDelivery.svg b/src/quick/doc/src/internal/pinchAndDragHandlers-singleMoveDelivery.svg
new file mode 100644
index 0000000000..3a69414d83
--- /dev/null
+++ b/src/quick/doc/src/internal/pinchAndDragHandlers-singleMoveDelivery.svg
@@ -0,0 +1,851 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
+<!-- Pages: 1 -->
+
+<svg
+ width="737.57623pt"
+ height="332.46246pt"
+ viewBox="0 0 737.65964 332.46246"
+ version="1.1"
+ id="svg806"
+ sodipodi:docname="pinchAndDragHandlers-singleMoveDelivery.svg"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <defs
+ id="defs810">
+ <marker
+ style="overflow:visible"
+ id="marker1576"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow5"
+ markerWidth="5.8874259"
+ markerHeight="6.6094756"
+ viewBox="0 0 5.8874262 6.6094758"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
+ id="path1574" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker1576-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow5"
+ markerWidth="5.8874259"
+ markerHeight="6.6094756"
+ viewBox="0 0 5.8874262 6.6094758"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
+ id="path1574-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow5"
+ markerWidth="5.8874264"
+ markerHeight="6.6094756"
+ viewBox="0 0 5.8874262 6.6094758"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
+ id="path8893" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker1576-4-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow5"
+ markerWidth="5.8874259"
+ markerHeight="6.6094756"
+ viewBox="0 0 5.8874262 6.6094758"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
+ id="path1574-4-3" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="namedview808"
+ pagecolor="#ffffff"
+ bordercolor="#111111"
+ borderopacity="1"
+ inkscape:showpageshadow="0"
+ inkscape:pageopacity="0"
+ inkscape:pagecheckerboard="1"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="pt"
+ showgrid="false"
+ inkscape:zoom="2.7028887"
+ inkscape:cx="512.78471"
+ inkscape:cy="236.59872"
+ inkscape:window-width="3840"
+ inkscape:window-height="2139"
+ inkscape:window-x="3840"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg806" />
+ <g
+ id="graph0"
+ class="graph"
+ transform="translate(4,328.48129)">
+ <polygon
+ fill="#ffffff"
+ stroke="none"
+ points="615.07,4 -4,4 -4,-328 615.07,-328 "
+ id="polygon654"
+ transform="matrix(1.1915609,0,0,1,0.76624365,0)" />
+ <!-- llfkmbbephlg -->
+ <g
+ id="node1"
+ class="node"
+ style="stroke-width:1.00011;stroke-dasharray:none">
+ <title
+ id="title656">llfkmbbephlg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="250.78,-288 474.53,-288 474.53,-324 262.78,-324 262.78,-328 250.78,-328 "
+ id="polygon658"
+ style="stroke-width:1.00011;stroke-dasharray:none" />
+ <polyline
+ fill="none"
+ stroke="#000000"
+ points="250.78,-324 262.78,-324"
+ id="polyline660"
+ style="stroke-width:1.00011;stroke-dasharray:none" />
+ <text
+ text-anchor="middle"
+ x="362.66"
+ y="-300.95001"
+ font-family="Times, serif"
+ font-size="6pt"
+ id="text662"
+ style="stroke-width:1.00011;stroke-dasharray:none">ResizeItemToWindow_QMLTYPE_1</text>
+ </g>
+ <!-- llfkmbbeijgg -->
+ <g
+ id="node2"
+ class="node">
+ <title
+ id="title665">llfkmbbeijgg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="322.78,-216 402.53,-216 402.53,-252 322.78,-252 "
+ id="polygon667" />
+ <text
+ text-anchor="middle"
+ x="362.66"
+ y="-229.32001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text669">ℚRootItem</text>
+ </g>
+ <!-- llfkmbbephlg&#45;&gt;llfkmbbeijgg -->
+ <g
+ id="edge1"
+ class="edge">
+ <title
+ id="title672">llfkmbbephlg-&gt;llfkmbbeijgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 362.66,-274.81 c 0,7.77 0,15.86 0,22.71"
+ id="path674" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="362.66,-286.8 358.66,-280.8 362.66,-274.8 366.66,-280.8 "
+ id="polygon676" />
+ </g>
+ <!-- llfkmbbepmbg -->
+ <g
+ id="node3"
+ class="node">
+ <title
+ id="title679">llfkmbbepmbg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="245.66,-144 327.66,-144 327.66,-180 245.66,-180 "
+ id="polygon681" />
+ <text
+ text-anchor="middle"
+ x="286.66"
+ y="-157.32001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text683">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbeijgg&#45;&gt;llfkmbbepmbg -->
+ <g
+ id="edge2"
+ class="edge">
+ <title
+ id="title686">llfkmbbeijgg-&gt;llfkmbbepmbg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 334.28,-206.87 c -9.61,8.86 -20.1,18.52 -28.79,26.52"
+ id="path688" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="343.21,-215.09 336.09,-213.96 334.38,-206.96 341.51,-208.08 "
+ id="polygon690" />
+ </g>
+ <!-- llfkmbclplkg -->
+ <g
+ id="node11"
+ class="node">
+ <title
+ id="title693">llfkmbclplkg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="345.8,-156.44 439.66,-144 533.52,-156.44 533.43,-176.56 345.89,-176.56 "
+ id="polygon695" />
+ <text
+ text-anchor="middle"
+ x="439.66"
+ y="-157.32001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text697">ℚDeliveryAgent</text>
+ </g>
+ <!-- llfkmbbeijgg&#45;&gt;llfkmbclplkg -->
+ <g
+ id="edge10"
+ class="edge">
+ <title
+ id="title700">llfkmbbeijgg-&gt;llfkmbclplkg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 391.18,-207.07 c 11.28,10.25 23.79,21.62 33.27,30.25"
+ id="path702" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="382.36,-215.09 384.11,-208.09 391.24,-207.02 389.49,-214.01 "
+ id="polygon704" />
+ </g>
+ <!-- llfkmbodpifg -->
+ <g
+ id="node4"
+ class="node">
+ <title
+ id="title707">llfkmbodpifg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="177.32,-95.56 88.66,-108 0,-95.56 0.08,-75.44 177.23,-75.44 "
+ id="polygon709" />
+ <text
+ text-anchor="middle"
+ x="88.660004"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text711">ℚPinchHandler</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbodpifg -->
+ <g
+ id="edge3"
+ class="edge">
+ <title
+ id="title714">llfkmbbepmbg-&gt;llfkmbodpifg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 233.33,-142.15 c -34.69,12.27 -78.95,27.92 -109.33,38.66"
+ id="path716" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="244.78,-146.2 237.79,-147.97 233.47,-142.2 240.46,-140.42 "
+ id="polygon718" />
+ </g>
+ <!-- llfkmbnfping -->
+ <g
+ id="node5"
+ class="node">
+ <title
+ id="title721">llfkmbnfping</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="195.66,-72 277.66,-72 277.66,-108 195.66,-108 "
+ id="polygon723" />
+ <text
+ text-anchor="middle"
+ x="236.66"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text725">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbnfping -->
+ <g
+ id="edge4"
+ class="edge">
+ <title
+ id="title728">llfkmbbepmbg-&gt;llfkmbnfping</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 266.73,-133.1 c -6.04,8.45 -12.48,17.48 -17.85,25"
+ id="path730" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="273.78,-142.96 267.03,-140.41 266.8,-133.2 273.54,-135.76 "
+ id="polygon732" />
+ </g>
+ <!-- llfkmbbdfibg -->
+ <g
+ id="node7"
+ class="node">
+ <title
+ id="title735">llfkmbbdfibg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="295.66,-72 377.66,-72 377.66,-108 295.66,-108 "
+ id="polygon737" />
+ <text
+ text-anchor="middle"
+ x="336.66"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text739">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbbdfibg -->
+ <g
+ id="edge6"
+ class="edge">
+ <title
+ id="title742">llfkmbbepmbg-&gt;llfkmbbdfibg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 306.59,-133.1 c 6.03,8.45 12.48,17.48 17.85,25"
+ id="path744" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="299.54,-142.96 299.77,-135.76 306.52,-133.2 306.28,-140.41 "
+ id="polygon746" />
+ </g>
+ <!-- llfkmbodeang -->
+ <g
+ id="node9"
+ class="node">
+ <title
+ id="title749">llfkmbodeang</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="440.66,-72 522.66,-72 522.66,-108 440.66,-108 "
+ id="polygon751" />
+ <text
+ text-anchor="middle"
+ x="481.66"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text753">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbodeang -->
+ <g
+ id="edge8"
+ class="edge">
+ <title
+ id="title756">llfkmbbepmbg-&gt;llfkmbodeang</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 340.14,-141.8 c 31.61,11.35 71.02,25.49 100.22,35.98"
+ id="path758" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="328.86,-145.85 333.16,-140.06 340.16,-141.8 335.86,-147.59 "
+ id="polygon760" />
+ </g>
+ <!-- llfkmbbfjjgg -->
+ <g
+ id="node6"
+ class="node">
+ <title
+ id="title763">llfkmbbfjjgg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="233.07,-23.56 147.66,-36 62.25,-23.56 62.33,-3.44 232.99,-3.44 "
+ id="polygon765" />
+ <text
+ text-anchor="middle"
+ x="147.66"
+ y="-13.33"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text767">ℚDragHandler</text>
+ </g>
+ <!-- llfkmbnfping&#45;&gt;llfkmbbfjjgg -->
+ <g
+ id="edge5"
+ class="edge">
+ <title
+ id="title770">llfkmbnfping-&gt;llfkmbbfjjgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 204.77,-63.92 c -12.86,10.12 -27.25,21.44 -38.37,30.18"
+ id="path772" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="213.95,-71.14 206.76,-70.57 204.52,-63.72 211.71,-64.29 "
+ id="polygon774" />
+ </g>
+ <!-- llfkmbbfibdg -->
+ <g
+ id="node8"
+ class="node">
+ <title
+ id="title777">llfkmbbfibdg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="422.07,-23.56 336.66,-36 251.25,-23.56 251.33,-3.44 421.99,-3.44 "
+ id="polygon779" />
+ <text
+ text-anchor="middle"
+ x="336.66"
+ y="-13.33"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text781">ℚDragHandler</text>
+ </g>
+ <!-- llfkmbbdfibg&#45;&gt;llfkmbbfibdg -->
+ <g
+ id="edge7"
+ class="edge">
+ <title
+ id="title784">llfkmbbdfibg-&gt;llfkmbbfibdg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 336.66,-58.81 c 0,7.77 0,15.86 0,22.71"
+ id="path786" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="336.66,-70.8 332.66,-64.8 336.66,-58.8 340.66,-64.8 "
+ id="polygon788" />
+ </g>
+ <!-- llfkmbcknglg -->
+ <g
+ id="node10"
+ class="node">
+ <title
+ id="title791">llfkmbcknglg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="611.07,-23.56 525.66,-36 440.25,-23.56 440.33,-3.44 610.99,-3.44 "
+ id="polygon793" />
+ <text
+ text-anchor="middle"
+ x="525.65997"
+ y="-13.33"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text795">ℚDragHandler</text>
+ </g>
+ <!-- llfkmbodeang&#45;&gt;llfkmbcknglg -->
+ <g
+ id="edge9"
+ class="edge">
+ <title
+ id="title798">llfkmbodeang-&gt;llfkmbcknglg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 499.32,-60.9 c 5.62,8.94 11.63,18.5 16.49,26.23"
+ id="path800" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="493.01,-70.93 492.82,-63.72 499.4,-60.77 499.59,-67.98 "
+ id="polygon802" />
+ </g>
+ <g
+ id="g11866"
+ class="edge"
+ transform="rotate(-90,623.51573,-276.02262)">
+ <title
+ id="title11860">llfkmbbephlg-&gt;llfkmbbeijgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 362.66,-274.81 c 0,7.77 0,15.86 0,22.71"
+ id="path11862" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="366.66,-280.8 362.66,-286.8 358.66,-280.8 362.66,-274.8 "
+ id="polygon11864" />
+ </g>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 708.8157,-33.802688 c 0,-1.93521 -13.67346,-3.50801 -30.51031,-3.50801 -16.83686,0 -30.51503,1.5728 -30.51503,3.50801 0,0 0,31.5378501 0,31.5378501 0,1.93522003 13.67817,3.50801 30.51503,3.50801 16.83685,0 30.51031,-1.57278997 30.51031,-3.50801 0,0 0,-31.5378501 0,-31.5378501"
+ id="path12337"
+ style="stroke-width:0.568213" />
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 708.8157,-33.802688 c 0,1.92838 -13.67346,3.50116 -30.51031,3.50116 -16.83686,0 -30.51503,-1.57278 -30.51503,-3.50116"
+ id="path12339"
+ style="stroke-width:0.568213" />
+ <text
+ text-anchor="middle"
+ x="678.23846"
+ y="-14.011026"
+ font-family="Times, serif"
+ font-size="6pt"
+ id="text12341"
+ style="stroke-width:0.681807">currentPoints</text>
+ <g
+ id="g14256"
+ class="edge"
+ transform="rotate(-90,507.65517,-314.66065)">
+ <title
+ id="title14250">llfkmbbephlg-&gt;llfkmbbeijgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 362.66,-274.81 c 0,7.77 0,15.86 0,22.71"
+ id="path14252" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="362.66,-286.8 358.66,-280.8 362.66,-274.8 366.66,-280.8 "
+ id="polygon14254" />
+ </g>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 631.59317,-188.30128 c 0,-1.93521 -13.67346,-3.50801 -30.51031,-3.50801 -16.83686,0 -30.51503,1.5728 -30.51503,3.50801 0,0 0,31.53785 0,31.53785 0,1.93522 13.67817,3.50801 30.51503,3.50801 16.83685,0 30.51031,-1.57279 30.51031,-3.50801 0,0 0,-31.53785 0,-31.53785"
+ id="path14258"
+ style="stroke-width:0.568213" />
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 631.59317,-188.30128 c 0,1.92838 -13.67346,3.50116 -30.51031,3.50116 -16.83686,0 -30.51503,-1.57278 -30.51503,-3.50116"
+ id="path14260"
+ style="stroke-width:0.568213" />
+ <text
+ text-anchor="middle"
+ x="601.01593"
+ y="-168.50961"
+ font-family="Times, serif"
+ font-size="6pt"
+ id="text14262"
+ style="stroke-width:0.681807">targetItems</text>
+ <g
+ id="g3826"
+ class="edge"
+ transform="rotate(180,500.1871,-52.761609)">
+ <title
+ id="title3820">llfkmbodeang-&gt;llfkmbcknglg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 499.32,-60.9 c 5.62,8.94 11.63,18.5 16.49,26.23"
+ id="path3822" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="492.82,-63.72 499.4,-60.77 499.59,-67.98 493.01,-70.93 "
+ id="polygon3824" />
+ </g>
+ </g>
+ <g
+ id="g2388"
+ transform="translate(166.85425,118.15234)">
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.869398;stroke-linecap:square;stroke-dasharray:0.869398, 0.869398;stroke-opacity:1"
+ id="rect981"
+ width="115.87793"
+ height="32.582088"
+ x="-181.46954"
+ y="-115.9365"
+ ry="0"
+ transform="matrix(1,0,-0.22867874,0.97350194,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9pt;line-height:125%;font-family:Times, serif;-inkscape-font-specification:'Times, serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ x="-149.44366"
+ y="-93.742676"
+ id="text1897"><tspan
+ sodipodi:role="line"
+ id="tspan1895"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9pt;font-family:Times, serif;-inkscape-font-specification:'Times, serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="-149.44366"
+ y="-93.742676">QGuiApplication</tspan></text>
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576)"
+ d="m 508.49821,147.40834 c -5.01114,-15.80414 29.88553,-12.14178 19.22974,-0.30829"
+ id="path2661"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 529.10578,290.07508 c 2.22687,-20.59627 43.00062,-73.20365 2.77101,-64.44971"
+ id="path9238"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="450.67688"
+ y="193.66904"
+ id="text9282"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="450.67688"
+ y="193.66904"
+ id="tspan9280">⑦ mapFromScene()</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="497.35483"
+ y="100.48878"
+ id="text9334"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="497.35483"
+ y="100.48878"
+ id="tspan9332">③ deliverPointerEvent()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="497.35483"
+ y="111.44315"
+ id="tspan1575">④ deliverUpdatedPoints()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="497.35483"
+ y="122.39753"
+ id="tspan1577">⑤ deliverToPassiveGrabbers()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="497.35483"
+ y="133.3519"
+ id="tspan9365">⑥ localizePointerEvent()</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 443.986,186.10711 c 3.61207,29.57315 14.20183,7.52734 15.4725,29.56066"
+ id="path9427"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576)"
+ d="m 546.28994,291.07097 c -3.52959,-16.19952 30.87947,-9.32879 19.17598,1.46963"
+ id="path14423"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="557.57617"
+ y="233.58138"
+ id="text14441"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="557.57617"
+ y="233.58138"
+ id="tspan14459"
+ sodipodi:role="line">⑩ handlePointerEventImpl()</tspan><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="557.57617"
+ y="244.53575"
+ sodipodi:role="line"
+ id="tspan2285">⑪ dragOverThreshold()</tspan><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="557.57617"
+ y="255.49011"
+ sodipodi:role="line"
+ id="tspan2287">⑫ grabPoints()</tspan><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="557.57617"
+ y="266.44449"
+ sodipodi:role="line"
+ id="tspan2289">⑬ setActive()</tspan><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="557.57617"
+ y="277.39886"
+ sodipodi:role="line"
+ id="tspan2603">⑰ moveTarget()</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.03579;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.03579, 1.03579;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#Arrow5)"
+ d="M 249.32923,23.153194 H 125.81655"
+ id="path1311" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="129.35161"
+ y="18.770849"
+ id="text1315"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="129.35161"
+ y="18.770849"
+ id="tspan1317">① event(QTouchEvent*)</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.03579;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.03579, 1.03579;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#Arrow5)"
+ d="M 480.13219,146.11428 434.01617,42.608119"
+ id="path2865"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="224.50352"
+ y="-380.62888"
+ id="text2981"
+ transform="rotate(65.571486)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="224.50352"
+ y="-380.62888"
+ id="tspan2979">② event(QTouchEvent*)</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4-5)"
+ d="m 442.97658,187.15842 c -50.02267,78.60672 40.30509,72.83709 29.70231,109.51513"
+ id="path9238-5"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="496.79193"
+ y="226.98381"
+ id="text9304-6"
+ transform="rotate(6.9725705)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:end;text-anchor:end;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="496.79193"
+ y="226.98381"
+ id="tspan9302"> ⑧ handlePointerEvent()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:end;text-anchor:end;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="496.79193"
+ y="237.93819"
+ id="tspan2397">⑨ wantsPointerEvent()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:end;text-anchor:end;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="496.79193"
+ y="247.93932"
+ id="tspan2371" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="639.57428"
+ y="275.21478"
+ id="text2293"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="639.57428"
+ y="275.21478"
+ id="tspan2291">⑭ onActiveChanged()</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 625.08309,266.11561 c 33.3115,8.38416 -25.30249,21.02634 -26.36628,32.66492"
+ id="path2399"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="537.05072"
+ y="198.02666"
+ id="text2575"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="537.05072"
+ y="198.02666"
+ id="tspan2573">⑮ activeChanged Ⓢ</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="537.05072"
+ y="208.98103"
+ id="tspan4018">⑯ setColor()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="537.05072"
+ y="219.93539"
+ id="tspan2601">⑱ setX() / setY()</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#808080;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text3431"
+ transform="rotate(-38.038218,476.61944,239.40311)"><textPath
+ xlink:href="#path9238-5"
+ id="textPath3609"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#808080;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ id="tspan3429">QTouchEvent*</tspan></textPath></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text3832"
+ transform="rotate(58.431196)"
+ x="474.64865"
+ y="-273.09793"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ id="tspan3828">target</tspan></text>
+ <circle
+ id="path4083"
+ style="fill:#000000;stroke:#e6a11b;stroke-width:0.750085"
+ cx="536.95331"
+ cy="217.47479"
+ r="0.0092422031" />
+ <circle
+ id="path4109"
+ style="fill:#000000;stroke:#e6a11b;stroke-width:0.750085"
+ cx="550.58368"
+ cy="218.91232"
+ r="0.0092422031" />
+ <circle
+ id="path4135"
+ style="fill:#000000;stroke:#e6a11b;stroke-width:0.750085"
+ cx="584.84467"
+ cy="-85.462952"
+ r="0.0092422031" />
+</svg>
diff --git a/src/quick/doc/src/internal/pinchAndDragHandlers-singlePressDelivery.svg b/src/quick/doc/src/internal/pinchAndDragHandlers-singlePressDelivery.svg
new file mode 100644
index 0000000000..e2f982fe5c
--- /dev/null
+++ b/src/quick/doc/src/internal/pinchAndDragHandlers-singlePressDelivery.svg
@@ -0,0 +1,714 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
+<!-- Pages: 1 -->
+
+<svg
+ width="715.88171pt"
+ height="331.96246pt"
+ viewBox="0 0 715.96267 331.96246"
+ version="1.1"
+ id="svg806"
+ sodipodi:docname="pinchAndDragHandlers-singlePressDelivery.svg"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <defs
+ id="defs810">
+ <marker
+ style="overflow:visible"
+ id="marker1576"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow5"
+ markerWidth="5.8874259"
+ markerHeight="6.6094756"
+ viewBox="0 0 5.8874262 6.6094758"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
+ id="path1574" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker1576-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow5"
+ markerWidth="5.8874259"
+ markerHeight="6.6094756"
+ viewBox="0 0 5.8874262 6.6094758"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
+ id="path1574-4" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="namedview808"
+ pagecolor="#ffffff"
+ bordercolor="#111111"
+ borderopacity="1"
+ inkscape:showpageshadow="0"
+ inkscape:pageopacity="0"
+ inkscape:pagecheckerboard="1"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="pt"
+ showgrid="false"
+ inkscape:zoom="2.7028887"
+ inkscape:cx="482.07682"
+ inkscape:cy="213.29032"
+ inkscape:window-width="3840"
+ inkscape:window-height="2139"
+ inkscape:window-x="3840"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg806" />
+ <g
+ id="graph0"
+ class="graph"
+ transform="translate(3.9999999,327.98119)">
+ <polygon
+ fill="#ffffff"
+ stroke="none"
+ points="615.07,4 -4,4 -4,-328 615.07,-328 "
+ id="polygon654"
+ transform="matrix(1.1565133,0,0,1,0.62605332,0)" />
+ <!-- llfkmbbephlg -->
+ <g
+ id="node1"
+ class="node"
+ style="stroke-width:1.00011;stroke-dasharray:none">
+ <title
+ id="title656">llfkmbbephlg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="262.78,-328 250.78,-328 250.78,-288 474.53,-288 474.53,-324 262.78,-324 "
+ id="polygon658"
+ style="stroke-width:1.00011;stroke-dasharray:none" />
+ <polyline
+ fill="none"
+ stroke="#000000"
+ points="250.78,-324 262.78,-324"
+ id="polyline660"
+ style="stroke-width:1.00011;stroke-dasharray:none" />
+ <text
+ text-anchor="middle"
+ x="362.66"
+ y="-300.95001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text662"
+ style="stroke-width:1.00011;stroke-dasharray:none">ResizeItemToWindow_QMLTYPE_1</text>
+ </g>
+ <!-- llfkmbbeijgg -->
+ <g
+ id="node2"
+ class="node">
+ <title
+ id="title665">llfkmbbeijgg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="402.53,-252 322.78,-252 322.78,-216 402.53,-216 "
+ id="polygon667" />
+ <text
+ text-anchor="middle"
+ x="362.66"
+ y="-229.32001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text669">ℚRootItem</text>
+ </g>
+ <!-- llfkmbbephlg&#45;&gt;llfkmbbeijgg -->
+ <g
+ id="edge1"
+ class="edge">
+ <title
+ id="title672">llfkmbbephlg-&gt;llfkmbbeijgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 362.66,-274.81 c 0,7.77 0,15.86 0,22.71"
+ id="path674" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="362.66,-274.8 366.66,-280.8 362.66,-286.8 358.66,-280.8 "
+ id="polygon676" />
+ </g>
+ <!-- llfkmbbepmbg -->
+ <g
+ id="node3"
+ class="node">
+ <title
+ id="title679">llfkmbbepmbg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="327.66,-180 245.66,-180 245.66,-144 327.66,-144 "
+ id="polygon681" />
+ <text
+ text-anchor="middle"
+ x="286.66"
+ y="-157.32001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text683">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbeijgg&#45;&gt;llfkmbbepmbg -->
+ <g
+ id="edge2"
+ class="edge">
+ <title
+ id="title686">llfkmbbeijgg-&gt;llfkmbbepmbg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 334.28,-206.87 c -9.61,8.86 -20.1,18.52 -28.79,26.52"
+ id="path688" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="334.38,-206.96 341.51,-208.08 343.21,-215.09 336.09,-213.96 "
+ id="polygon690" />
+ </g>
+ <!-- llfkmbclplkg -->
+ <g
+ id="node11"
+ class="node">
+ <title
+ id="title693">llfkmbclplkg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="533.43,-176.56 345.89,-176.56 345.8,-156.44 439.66,-144 533.52,-156.44 "
+ id="polygon695" />
+ <text
+ text-anchor="middle"
+ x="439.66"
+ y="-157.32001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text697">ℚDeliveryAgent</text>
+ </g>
+ <!-- llfkmbbeijgg&#45;&gt;llfkmbclplkg -->
+ <g
+ id="edge10"
+ class="edge">
+ <title
+ id="title700">llfkmbbeijgg-&gt;llfkmbclplkg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 391.18,-207.07 c 11.28,10.25 23.79,21.62 33.27,30.25"
+ id="path702" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="391.24,-207.02 389.49,-214.01 382.36,-215.09 384.11,-208.09 "
+ id="polygon704" />
+ </g>
+ <!-- llfkmbodpifg -->
+ <g
+ id="node4"
+ class="node">
+ <title
+ id="title707">llfkmbodpifg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="0.08,-75.44 177.23,-75.44 177.32,-95.56 88.66,-108 0,-95.56 "
+ id="polygon709" />
+ <text
+ text-anchor="middle"
+ x="88.660004"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text711">ℚPinchHandler</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbodpifg -->
+ <g
+ id="edge3"
+ class="edge">
+ <title
+ id="title714">llfkmbbepmbg-&gt;llfkmbodpifg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 233.33,-142.15 c -34.69,12.27 -78.95,27.92 -109.33,38.66"
+ id="path716" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="233.47,-142.2 240.46,-140.42 244.78,-146.2 237.79,-147.97 "
+ id="polygon718" />
+ </g>
+ <!-- llfkmbnfping -->
+ <g
+ id="node5"
+ class="node">
+ <title
+ id="title721">llfkmbnfping</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="277.66,-108 195.66,-108 195.66,-72 277.66,-72 "
+ id="polygon723" />
+ <text
+ text-anchor="middle"
+ x="236.66"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text725">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbnfping -->
+ <g
+ id="edge4"
+ class="edge">
+ <title
+ id="title728">llfkmbbepmbg-&gt;llfkmbnfping</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 266.73,-133.1 c -6.04,8.45 -12.48,17.48 -17.85,25"
+ id="path730" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="266.8,-133.2 273.54,-135.76 273.78,-142.96 267.03,-140.41 "
+ id="polygon732" />
+ </g>
+ <!-- llfkmbbdfibg -->
+ <g
+ id="node7"
+ class="node">
+ <title
+ id="title735">llfkmbbdfibg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="377.66,-108 295.66,-108 295.66,-72 377.66,-72 "
+ id="polygon737" />
+ <text
+ text-anchor="middle"
+ x="336.66"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text739">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbbdfibg -->
+ <g
+ id="edge6"
+ class="edge">
+ <title
+ id="title742">llfkmbbepmbg-&gt;llfkmbbdfibg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 306.59,-133.1 c 6.03,8.45 12.48,17.48 17.85,25"
+ id="path744" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="306.52,-133.2 306.28,-140.41 299.54,-142.96 299.77,-135.76 "
+ id="polygon746" />
+ </g>
+ <!-- llfkmbodeang -->
+ <g
+ id="node9"
+ class="node">
+ <title
+ id="title749">llfkmbodeang</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="522.66,-108 440.66,-108 440.66,-72 522.66,-72 "
+ id="polygon751" />
+ <text
+ text-anchor="middle"
+ x="481.66"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text753">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbodeang -->
+ <g
+ id="edge8"
+ class="edge">
+ <title
+ id="title756">llfkmbbepmbg-&gt;llfkmbodeang</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 340.14,-141.8 c 31.61,11.35 71.02,25.49 100.22,35.98"
+ id="path758" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="340.16,-141.8 335.86,-147.59 328.86,-145.85 333.16,-140.06 "
+ id="polygon760" />
+ </g>
+ <!-- llfkmbbfjjgg -->
+ <g
+ id="node6"
+ class="node">
+ <title
+ id="title763">llfkmbbfjjgg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="62.33,-3.44 232.99,-3.44 233.07,-23.56 147.66,-36 62.25,-23.56 "
+ id="polygon765" />
+ <text
+ text-anchor="middle"
+ x="147.66"
+ y="-13.33"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text767">ℚDragHandler</text>
+ </g>
+ <!-- llfkmbnfping&#45;&gt;llfkmbbfjjgg -->
+ <g
+ id="edge5"
+ class="edge">
+ <title
+ id="title770">llfkmbnfping-&gt;llfkmbbfjjgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 204.77,-63.92 c -12.86,10.12 -27.25,21.44 -38.37,30.18"
+ id="path772" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="204.52,-63.72 211.71,-64.29 213.95,-71.14 206.76,-70.57 "
+ id="polygon774" />
+ </g>
+ <!-- llfkmbbfibdg -->
+ <g
+ id="node8"
+ class="node">
+ <title
+ id="title777">llfkmbbfibdg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="251.33,-3.44 421.99,-3.44 422.07,-23.56 336.66,-36 251.25,-23.56 "
+ id="polygon779" />
+ <text
+ text-anchor="middle"
+ x="336.66"
+ y="-13.33"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text781">ℚDragHandler</text>
+ </g>
+ <!-- llfkmbbdfibg&#45;&gt;llfkmbbfibdg -->
+ <g
+ id="edge7"
+ class="edge">
+ <title
+ id="title784">llfkmbbdfibg-&gt;llfkmbbfibdg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 336.66,-58.81 c 0,7.77 0,15.86 0,22.71"
+ id="path786" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="336.66,-58.8 340.66,-64.8 336.66,-70.8 332.66,-64.8 "
+ id="polygon788" />
+ </g>
+ <!-- llfkmbcknglg -->
+ <g
+ id="node10"
+ class="node">
+ <title
+ id="title791">llfkmbcknglg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="440.33,-3.44 610.99,-3.44 611.07,-23.56 525.66,-36 440.25,-23.56 "
+ id="polygon793" />
+ <text
+ text-anchor="middle"
+ x="525.65997"
+ y="-13.33"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text795">ℚDragHandler</text>
+ </g>
+ <!-- llfkmbodeang&#45;&gt;llfkmbcknglg -->
+ <g
+ id="edge9"
+ class="edge">
+ <title
+ id="title798">llfkmbodeang-&gt;llfkmbcknglg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 499.32,-60.9 c 5.62,8.94 11.63,18.5 16.49,26.23"
+ id="path800" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="499.4,-60.77 499.59,-67.98 493.01,-70.93 492.82,-63.72 "
+ id="polygon802" />
+ </g>
+ <g
+ id="g11866"
+ class="edge"
+ transform="rotate(-90,623.51573,-276.02262)">
+ <title
+ id="title11860">llfkmbbephlg-&gt;llfkmbbeijgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 362.66,-274.81 c 0,7.77 0,15.86 0,22.71"
+ id="path11862" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="358.66,-280.8 362.66,-274.8 366.66,-280.8 362.66,-286.8 "
+ id="polygon11864" />
+ </g>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 708.8157,-33.802688 c 0,-1.93521 -13.67346,-3.50801 -30.51031,-3.50801 -16.83686,0 -30.51503,1.5728 -30.51503,3.50801 0,0 0,31.5378501 0,31.5378501 0,1.93522003 13.67817,3.50801 30.51503,3.50801 16.83685,0 30.51031,-1.57278997 30.51031,-3.50801 0,0 0,-31.5378501 0,-31.5378501"
+ id="path12337"
+ style="stroke-width:0.568213" />
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 708.8157,-33.802688 c 0,1.92838 -13.67346,3.50116 -30.51031,3.50116 -16.83686,0 -30.51503,-1.57278 -30.51503,-3.50116"
+ id="path12339"
+ style="stroke-width:0.568213" />
+ <text
+ text-anchor="middle"
+ x="678.23846"
+ y="-14.011026"
+ font-family="Times, serif"
+ font-size="6pt"
+ id="text12341"
+ style="stroke-width:0.681807">currentPoints</text>
+ <g
+ id="g14256"
+ class="edge"
+ transform="rotate(-90,507.65517,-314.66065)">
+ <title
+ id="title14250">llfkmbbephlg-&gt;llfkmbbeijgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 362.66,-274.81 c 0,7.77 0,15.86 0,22.71"
+ id="path14252" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="362.66,-274.8 366.66,-280.8 362.66,-286.8 358.66,-280.8 "
+ id="polygon14254" />
+ </g>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 631.59317,-188.30128 c 0,-1.93521 -13.67346,-3.50801 -30.51031,-3.50801 -16.83686,0 -30.51503,1.5728 -30.51503,3.50801 0,0 0,31.53785 0,31.53785 0,1.93522 13.67817,3.50801 30.51503,3.50801 16.83685,0 30.51031,-1.57279 30.51031,-3.50801 0,0 0,-31.53785 0,-31.53785"
+ id="path14258"
+ style="stroke-width:0.568213" />
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 631.59317,-188.30128 c 0,1.92838 -13.67346,3.50116 -30.51031,3.50116 -16.83686,0 -30.51503,-1.57278 -30.51503,-3.50116"
+ id="path14260"
+ style="stroke-width:0.568213" />
+ <text
+ text-anchor="middle"
+ x="601.01593"
+ y="-168.50961"
+ font-family="Times, serif"
+ font-size="6pt"
+ id="text14262"
+ style="stroke-width:0.681807">targetItems</text>
+ </g>
+ <g
+ id="g2388"
+ transform="translate(166.85425,117.65224)">
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.869398;stroke-linecap:square;stroke-dasharray:0.869398, 0.869398;stroke-opacity:1"
+ id="rect981"
+ width="115.87793"
+ height="32.582088"
+ x="-181.46954"
+ y="-115.9365"
+ ry="0"
+ transform="matrix(1,0,-0.22867874,0.97350194,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9pt;line-height:125%;font-family:Times, serif;-inkscape-font-specification:'Times, serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ x="-149.44366"
+ y="-93.742676"
+ id="text1897"><tspan
+ sodipodi:role="line"
+ id="tspan1895"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9pt;font-family:Times, serif;-inkscape-font-specification:'Times, serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="-149.44366"
+ y="-93.742676">QGuiApplication</tspan></text>
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576)"
+ d="m 534.3515,175.55291 c 8.9308,13.96865 -25.72468,19.46301 -18.49471,5.27481"
+ id="path2661"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#e6a11b;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="113.75787"
+ y="213.93288"
+ id="text8866"
+ transform="rotate(-11.181322)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#e6a11b;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="113.75787"
+ y="213.93288"
+ id="tspan8864">skipped</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e6a11b;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="M 248.80679,166.05103 C 128.29267,210.33716 109.36613,183.17227 102.95996,215.73635"
+ id="path2625"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e6a11b;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 205.26622,258.16221 c -30.99608,41.44745 -40.03963,1.76839 -45.06759,29.20422"
+ id="path9198"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e6a11b;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 325.15207,257.83821 c -2.27262,29.75722 -30.19879,12.70432 -28.21604,34.22384"
+ id="path9218"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 515.92916,258.31316 c 8.69611,26.1658 28.09925,12.12573 28.29307,30.37142"
+ id="path9238"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="412.41052"
+ y="194.7211"
+ id="text9282"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="412.41052"
+ y="194.7211"
+ id="tspan9280">③ mapFromScene()</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="527.64844"
+ y="266.12436"
+ id="text9304"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="527.64844"
+ y="266.12436"
+ id="tspan11558">⑤ handlePointerEvent()</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="539.94745"
+ y="184.11032"
+ id="text9334"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="539.94745"
+ y="184.11032"
+ id="tspan9332">① deliverMatchingPointsToItem()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="539.94745"
+ y="195.0647"
+ id="tspan9365">② localizePointerEvent()</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e6a11b;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 371.17602,176.60114 c -19.44733,11.33075 -28.42572,-6.22235 -36.44805,-6.86652"
+ id="path9367"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e6a11b;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 371.17602,176.60114 c -14.82664,21.37092 -94.59207,21.74646 -97.17351,38.08234"
+ id="path9387"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#e6a11b;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 371.17602,176.60114 c -14.82664,21.37092 4.12412,22.17486 1.54268,38.51074"
+ id="path9407"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 371.17602,176.60114 c -14.82664,21.37092 90.86392,22.23065 88.28248,38.56653"
+ id="path9427"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#e6a11b;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="362.56143"
+ y="141.40547"
+ id="text11290"
+ transform="rotate(10.069153)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#e6a11b;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="362.56143"
+ y="141.40547"
+ id="tspan11288">skipped</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="459.80051"
+ y="208.66859"
+ id="text11424"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="459.80051"
+ y="208.66859"
+ id="tspan11422">④ handlePointerEvent()</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576)"
+ d="m 553.17544,291.61876 c -3.52959,-16.19952 30.87947,-9.32879 19.17598,1.46963"
+ id="path14423"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="577.46771"
+ y="276.84311"
+ id="text14441"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="577.46771"
+ y="276.84311"
+ id="tspan14439">⑥ handlePointerEventImpl()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="577.46771"
+ y="287.79749"
+ id="tspan14459">⑦ setPassiveGrab()</tspan></text>
+</svg>
diff --git a/src/quick/doc/src/internal/pinchAndDragHandlers-singlePressPrep.svg b/src/quick/doc/src/internal/pinchAndDragHandlers-singlePressPrep.svg
new file mode 100644
index 0000000000..4cec17b399
--- /dev/null
+++ b/src/quick/doc/src/internal/pinchAndDragHandlers-singlePressPrep.svg
@@ -0,0 +1,648 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Pages: 1 -->
+
+<svg
+ width="695.15735pt"
+ height="331.96246pt"
+ viewBox="0 0 695.23596 331.96246"
+ version="1.1"
+ id="svg806"
+ sodipodi:docname="pinchAndDragHandlers-singlePressPrep.svg"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <defs
+ id="defs810">
+ <marker
+ style="overflow:visible"
+ id="Arrow5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow5"
+ markerWidth="5.8874264"
+ markerHeight="6.6094756"
+ viewBox="0 0 5.8874262 6.6094758"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
+ id="path8893" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker1576"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow5"
+ markerWidth="5.8874259"
+ markerHeight="6.6094756"
+ viewBox="0 0 5.8874262 6.6094758"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
+ id="path1574" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker1576-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow5"
+ markerWidth="5.8874259"
+ markerHeight="6.6094756"
+ viewBox="0 0 5.8874262 6.6094758"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
+ id="path1574-4" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="namedview808"
+ pagecolor="#ffffff"
+ bordercolor="#111111"
+ borderopacity="1"
+ inkscape:showpageshadow="0"
+ inkscape:pageopacity="0"
+ inkscape:pagecheckerboard="1"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="pt"
+ showgrid="false"
+ inkscape:zoom="2.6661199"
+ inkscape:cx="434.33906"
+ inkscape:cy="270.61799"
+ inkscape:window-width="3840"
+ inkscape:window-height="2139"
+ inkscape:window-x="3840"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg806" />
+ <g
+ id="graph0"
+ class="graph"
+ transform="translate(3.9999998,327.9812)">
+ <polygon
+ fill="#ffffff"
+ stroke="none"
+ points="615.07,-328 615.07,4 -4,4 -4,-328 "
+ id="polygon654"
+ transform="matrix(1.1230329,0,0,1,0.4921318,0)" />
+ <!-- llfkmbbephlg -->
+ <g
+ id="node1"
+ class="node"
+ style="stroke-width:1.00011;stroke-dasharray:none">
+ <title
+ id="title656">llfkmbbephlg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="250.78,-288 474.53,-288 474.53,-324 262.78,-324 262.78,-328 250.78,-328 "
+ id="polygon658"
+ style="stroke-width:1.00011;stroke-dasharray:none" />
+ <polyline
+ fill="none"
+ stroke="#000000"
+ points="250.78,-324 262.78,-324"
+ id="polyline660"
+ style="stroke-width:1.00011;stroke-dasharray:none" />
+ <text
+ text-anchor="middle"
+ x="362.66"
+ y="-300.95001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text662"
+ style="stroke-width:1.00011;stroke-dasharray:none">ResizeItemToWindow_QMLTYPE_1</text>
+ </g>
+ <!-- llfkmbbeijgg -->
+ <g
+ id="node2"
+ class="node">
+ <title
+ id="title665">llfkmbbeijgg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="402.53,-252 322.78,-252 322.78,-216 402.53,-216 "
+ id="polygon667" />
+ <text
+ text-anchor="middle"
+ x="362.66"
+ y="-229.32001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text669">ℚRootItem</text>
+ </g>
+ <!-- llfkmbbephlg&#45;&gt;llfkmbbeijgg -->
+ <g
+ id="edge1"
+ class="edge">
+ <title
+ id="title672">llfkmbbephlg-&gt;llfkmbbeijgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 362.66,-274.81 c 0,7.77 0,15.86 0,22.71"
+ id="path674" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="362.66,-274.8 366.66,-280.8 362.66,-286.8 358.66,-280.8 "
+ id="polygon676" />
+ </g>
+ <!-- llfkmbbepmbg -->
+ <g
+ id="node3"
+ class="node">
+ <title
+ id="title679">llfkmbbepmbg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="327.66,-180 245.66,-180 245.66,-144 327.66,-144 "
+ id="polygon681" />
+ <text
+ text-anchor="middle"
+ x="286.66"
+ y="-157.32001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text683">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbeijgg&#45;&gt;llfkmbbepmbg -->
+ <g
+ id="edge2"
+ class="edge">
+ <title
+ id="title686">llfkmbbeijgg-&gt;llfkmbbepmbg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 334.28,-206.87 c -9.61,8.86 -20.1,18.52 -28.79,26.52"
+ id="path688" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="334.38,-206.96 341.51,-208.08 343.21,-215.09 336.09,-213.96 "
+ id="polygon690" />
+ </g>
+ <!-- llfkmbclplkg -->
+ <g
+ id="node11"
+ class="node">
+ <title
+ id="title693">llfkmbclplkg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="345.89,-176.56 345.8,-156.44 439.66,-144 533.52,-156.44 533.43,-176.56 "
+ id="polygon695" />
+ <text
+ text-anchor="middle"
+ x="439.66"
+ y="-157.32001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text697">ℚDeliveryAgent</text>
+ </g>
+ <!-- llfkmbbeijgg&#45;&gt;llfkmbclplkg -->
+ <g
+ id="edge10"
+ class="edge">
+ <title
+ id="title700">llfkmbbeijgg-&gt;llfkmbclplkg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 391.18,-207.07 c 11.28,10.25 23.79,21.62 33.27,30.25"
+ id="path702" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="391.24,-207.02 389.49,-214.01 382.36,-215.09 384.11,-208.09 "
+ id="polygon704" />
+ </g>
+ <!-- llfkmbodpifg -->
+ <g
+ id="node4"
+ class="node">
+ <title
+ id="title707">llfkmbodpifg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="177.23,-75.44 177.32,-95.56 88.66,-108 0,-95.56 0.08,-75.44 "
+ id="polygon709" />
+ <text
+ text-anchor="middle"
+ x="88.660004"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text711">ℚPinchHandler</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbodpifg -->
+ <g
+ id="edge3"
+ class="edge">
+ <title
+ id="title714">llfkmbbepmbg-&gt;llfkmbodpifg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 233.33,-142.15 c -34.69,12.27 -78.95,27.92 -109.33,38.66"
+ id="path716" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="233.47,-142.2 240.46,-140.42 244.78,-146.2 237.79,-147.97 "
+ id="polygon718" />
+ </g>
+ <!-- llfkmbnfping -->
+ <g
+ id="node5"
+ class="node">
+ <title
+ id="title721">llfkmbnfping</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="277.66,-108 195.66,-108 195.66,-72 277.66,-72 "
+ id="polygon723" />
+ <text
+ text-anchor="middle"
+ x="236.66"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text725">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbnfping -->
+ <g
+ id="edge4"
+ class="edge">
+ <title
+ id="title728">llfkmbbepmbg-&gt;llfkmbnfping</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 266.73,-133.1 c -6.04,8.45 -12.48,17.48 -17.85,25"
+ id="path730" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="266.8,-133.2 273.54,-135.76 273.78,-142.96 267.03,-140.41 "
+ id="polygon732" />
+ </g>
+ <!-- llfkmbbdfibg -->
+ <g
+ id="node7"
+ class="node">
+ <title
+ id="title735">llfkmbbdfibg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="377.66,-108 295.66,-108 295.66,-72 377.66,-72 "
+ id="polygon737" />
+ <text
+ text-anchor="middle"
+ x="336.66"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text739">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbbdfibg -->
+ <g
+ id="edge6"
+ class="edge">
+ <title
+ id="title742">llfkmbbepmbg-&gt;llfkmbbdfibg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 306.59,-133.1 c 6.03,8.45 12.48,17.48 17.85,25"
+ id="path744" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="306.52,-133.2 306.28,-140.41 299.54,-142.96 299.77,-135.76 "
+ id="polygon746" />
+ </g>
+ <!-- llfkmbodeang -->
+ <g
+ id="node9"
+ class="node">
+ <title
+ id="title749">llfkmbodeang</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="522.66,-108 440.66,-108 440.66,-72 522.66,-72 "
+ id="polygon751" />
+ <text
+ text-anchor="middle"
+ x="481.66"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text753">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbodeang -->
+ <g
+ id="edge8"
+ class="edge">
+ <title
+ id="title756">llfkmbbepmbg-&gt;llfkmbodeang</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 340.14,-141.8 c 31.61,11.35 71.02,25.49 100.22,35.98"
+ id="path758" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="340.16,-141.8 335.86,-147.59 328.86,-145.85 333.16,-140.06 "
+ id="polygon760" />
+ </g>
+ <!-- llfkmbbfjjgg -->
+ <g
+ id="node6"
+ class="node">
+ <title
+ id="title763">llfkmbbfjjgg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="232.99,-3.44 233.07,-23.56 147.66,-36 62.25,-23.56 62.33,-3.44 "
+ id="polygon765" />
+ <text
+ text-anchor="middle"
+ x="147.66"
+ y="-13.33"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text767">ℚDragHandler</text>
+ </g>
+ <!-- llfkmbnfping&#45;&gt;llfkmbbfjjgg -->
+ <g
+ id="edge5"
+ class="edge">
+ <title
+ id="title770">llfkmbnfping-&gt;llfkmbbfjjgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 204.77,-63.92 c -12.86,10.12 -27.25,21.44 -38.37,30.18"
+ id="path772" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="204.52,-63.72 211.71,-64.29 213.95,-71.14 206.76,-70.57 "
+ id="polygon774" />
+ </g>
+ <!-- llfkmbbfibdg -->
+ <g
+ id="node8"
+ class="node">
+ <title
+ id="title777">llfkmbbfibdg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="421.99,-3.44 422.07,-23.56 336.66,-36 251.25,-23.56 251.33,-3.44 "
+ id="polygon779" />
+ <text
+ text-anchor="middle"
+ x="336.66"
+ y="-13.33"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text781">ℚDragHandler</text>
+ </g>
+ <!-- llfkmbbdfibg&#45;&gt;llfkmbbfibdg -->
+ <g
+ id="edge7"
+ class="edge">
+ <title
+ id="title784">llfkmbbdfibg-&gt;llfkmbbfibdg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 336.66,-58.81 c 0,7.77 0,15.86 0,22.71"
+ id="path786" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="336.66,-58.8 340.66,-64.8 336.66,-70.8 332.66,-64.8 "
+ id="polygon788" />
+ </g>
+ <!-- llfkmbcknglg -->
+ <g
+ id="node10"
+ class="node">
+ <title
+ id="title791">llfkmbcknglg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="610.99,-3.44 611.07,-23.56 525.66,-36 440.25,-23.56 440.33,-3.44 "
+ id="polygon793" />
+ <text
+ text-anchor="middle"
+ x="525.65997"
+ y="-13.33"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text795">ℚDragHandler</text>
+ </g>
+ <!-- llfkmbodeang&#45;&gt;llfkmbcknglg -->
+ <g
+ id="edge9"
+ class="edge">
+ <title
+ id="title798">llfkmbodeang-&gt;llfkmbcknglg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 499.32,-60.9 c 5.62,8.94 11.63,18.5 16.49,26.23"
+ id="path800" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="499.4,-60.77 499.59,-67.98 493.01,-70.93 492.82,-63.72 "
+ id="polygon802" />
+ </g>
+ </g>
+ <g
+ id="g2388"
+ transform="translate(166.85425,117.65225)">
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.869398;stroke-linecap:square;stroke-dasharray:0.869398, 0.869398;stroke-opacity:1"
+ id="rect981"
+ width="115.87793"
+ height="32.582088"
+ x="-181.46954"
+ y="-115.9365"
+ ry="0"
+ transform="matrix(1,0,-0.22867874,0.97350194,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9pt;line-height:125%;font-family:Times, serif;-inkscape-font-specification:'Times, serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ x="-149.44366"
+ y="-93.742676"
+ id="text1897"><tspan
+ sodipodi:role="line"
+ id="tspan1895"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9pt;font-family:Times, serif;-inkscape-font-specification:'Times, serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="-149.44366"
+ y="-93.742676">QGuiApplication</tspan></text>
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.03579;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.03579, 1.03579;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#Arrow5)"
+ d="M 250.09544,22.1843 H 126.58276"
+ id="path1311" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="130.11781"
+ y="17.801956"
+ id="text1315"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="130.11781"
+ y="17.801956"
+ id="tspan1317">① event(QTouchEvent*)</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.03579;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.03579, 1.03579;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#Arrow5)"
+ d="M 480.8984,145.14539 434.78238,41.639225"
+ id="path2865"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="223.93822"
+ y="-381.72717"
+ id="text2981"
+ transform="rotate(65.571486)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="223.93822"
+ y="-381.72717"
+ id="tspan2979">② event(QTouchEvent*)</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576)"
+ d="m 534.3515,175.55292 c 8.9308,13.96865 -25.72468,19.46301 -18.49471,5.27481"
+ id="path2661"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="540.16193"
+ y="178.55621"
+ id="text8573"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="540.16193"
+ y="178.55621"
+ id="tspan8587">③ deliverPointerEvent()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="540.16193"
+ y="189.51059"
+ id="tspan8591">④ deliverPressOrReleaseEvent()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="540.16193"
+ y="200.46495"
+ id="tspan8595">⑤ pointerTargets()</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="187.83101"
+ y="197.08606"
+ id="text8866"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:end;text-anchor:end;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="187.83101"
+ y="197.08606"
+ id="tspan8864">⑥ wantsEventPoint()</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 414.44327,180.9263 c -120.51412,44.28613 -305.07714,2.24598 -311.48331,34.81006"
+ id="path2625"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="M 414.44327,180.9263 C 293.92915,225.21243 166.6048,254.80236 160.19863,287.36644"
+ id="path9198"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="M 414.44327,180.9263 C 293.92915,225.21243 303.3422,259.49798 296.93603,292.06206"
+ id="path9218"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 414.44327,180.9263 c 8.69611,26.1658 156.27171,32.20621 129.77896,107.75829"
+ id="path9238"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="180.63849"
+ y="263.64062"
+ id="text9260"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:end;text-anchor:end;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="162.79994"
+ y="275.0322"
+ id="tspan9258">⑦ wantsEventPoint()</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;text-anchor:end;text-align:end"
+ x="295.72836"
+ y="286.02438"
+ id="text9282"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;text-anchor:end;text-align:end"
+ x="203.01468"
+ y="286.02438"
+ id="tspan9280">⑧ wantsEventPoint()</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="550.57092"
+ y="278.21912"
+ id="text9304"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="550.57092"
+ y="278.21912"
+ id="tspan9302">⑨ wantsEventPoint()</tspan></text>
+ <g
+ id="node34"
+ class="node"
+ transform="matrix(0.68180684,0,0,0.68180684,-606.60021,386.57842)">
+ <title
+ id="title12335">llncgjfhndpg</title>
+ </g>
+</svg>
diff --git a/src/quick/doc/src/internal/pinchAndDragHandlers-singleReleaseDelivery.svg b/src/quick/doc/src/internal/pinchAndDragHandlers-singleReleaseDelivery.svg
new file mode 100644
index 0000000000..d96bf4ff10
--- /dev/null
+++ b/src/quick/doc/src/internal/pinchAndDragHandlers-singleReleaseDelivery.svg
@@ -0,0 +1,825 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Pages: 1 -->
+
+<svg
+ width="737.57623pt"
+ height="332.46246pt"
+ viewBox="0 0 737.65964 332.46246"
+ version="1.1"
+ id="svg806"
+ sodipodi:docname="pinchAndDragHandlers-singleReleaseDelivery.svg"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <defs
+ id="defs810">
+ <marker
+ style="overflow:visible"
+ id="marker1576"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow5"
+ markerWidth="5.8874259"
+ markerHeight="6.6094756"
+ viewBox="0 0 5.8874262 6.6094758"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
+ id="path1574" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker1576-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow5"
+ markerWidth="5.8874259"
+ markerHeight="6.6094756"
+ viewBox="0 0 5.8874262 6.6094758"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
+ id="path1574-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow5"
+ markerWidth="5.8874264"
+ markerHeight="6.6094756"
+ viewBox="0 0 5.8874262 6.6094758"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
+ id="path8893" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker1576-4-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow5"
+ markerWidth="5.8874259"
+ markerHeight="6.6094756"
+ viewBox="0 0 5.8874262 6.6094758"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z"
+ id="path1574-4-3" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="namedview808"
+ pagecolor="#ffffff"
+ bordercolor="#111111"
+ borderopacity="1"
+ inkscape:showpageshadow="0"
+ inkscape:pageopacity="0"
+ inkscape:pagecheckerboard="1"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="pt"
+ showgrid="false"
+ inkscape:zoom="2.7028887"
+ inkscape:cx="472.64247"
+ inkscape:cy="236.96869"
+ inkscape:window-width="3840"
+ inkscape:window-height="2139"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg806" />
+ <g
+ id="graph0"
+ class="graph"
+ transform="translate(4,328.48129)">
+ <polygon
+ fill="#ffffff"
+ stroke="none"
+ points="615.07,4 -4,4 -4,-328 615.07,-328 "
+ id="polygon654"
+ transform="matrix(1.1915609,0,0,1,0.76624365,0)" />
+ <!-- llfkmbbephlg -->
+ <g
+ id="node1"
+ class="node"
+ style="stroke-width:1.00011;stroke-dasharray:none">
+ <title
+ id="title656">llfkmbbephlg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="250.78,-288 474.53,-288 474.53,-324 262.78,-324 262.78,-328 250.78,-328 "
+ id="polygon658"
+ style="stroke-width:1.00011;stroke-dasharray:none" />
+ <polyline
+ fill="none"
+ stroke="#000000"
+ points="250.78,-324 262.78,-324"
+ id="polyline660"
+ style="stroke-width:1.00011;stroke-dasharray:none" />
+ <text
+ text-anchor="middle"
+ x="362.66"
+ y="-300.95001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text662"
+ style="stroke-width:1.00011;stroke-dasharray:none">ResizeItemToWindow_QMLTYPE_1</text>
+ </g>
+ <!-- llfkmbbeijgg -->
+ <g
+ id="node2"
+ class="node">
+ <title
+ id="title665">llfkmbbeijgg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="322.78,-216 402.53,-216 402.53,-252 322.78,-252 "
+ id="polygon667" />
+ <text
+ text-anchor="middle"
+ x="362.66"
+ y="-229.32001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text669">ℚRootItem</text>
+ </g>
+ <!-- llfkmbbephlg&#45;&gt;llfkmbbeijgg -->
+ <g
+ id="edge1"
+ class="edge">
+ <title
+ id="title672">llfkmbbephlg-&gt;llfkmbbeijgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 362.66,-274.81 c 0,7.77 0,15.86 0,22.71"
+ id="path674" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="362.66,-286.8 358.66,-280.8 362.66,-274.8 366.66,-280.8 "
+ id="polygon676" />
+ </g>
+ <!-- llfkmbbepmbg -->
+ <g
+ id="node3"
+ class="node">
+ <title
+ id="title679">llfkmbbepmbg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="245.66,-144 327.66,-144 327.66,-180 245.66,-180 "
+ id="polygon681" />
+ <text
+ text-anchor="middle"
+ x="286.66"
+ y="-157.32001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text683">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbeijgg&#45;&gt;llfkmbbepmbg -->
+ <g
+ id="edge2"
+ class="edge">
+ <title
+ id="title686">llfkmbbeijgg-&gt;llfkmbbepmbg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 334.28,-206.87 c -9.61,8.86 -20.1,18.52 -28.79,26.52"
+ id="path688" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="343.21,-215.09 336.09,-213.96 334.38,-206.96 341.51,-208.08 "
+ id="polygon690" />
+ </g>
+ <!-- llfkmbclplkg -->
+ <g
+ id="node11"
+ class="node">
+ <title
+ id="title693">llfkmbclplkg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="345.8,-156.44 439.66,-144 533.52,-156.44 533.43,-176.56 345.89,-176.56 "
+ id="polygon695" />
+ <text
+ text-anchor="middle"
+ x="439.66"
+ y="-157.32001"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text697">ℚDeliveryAgent</text>
+ </g>
+ <!-- llfkmbbeijgg&#45;&gt;llfkmbclplkg -->
+ <g
+ id="edge10"
+ class="edge">
+ <title
+ id="title700">llfkmbbeijgg-&gt;llfkmbclplkg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 391.18,-207.07 c 11.28,10.25 23.79,21.62 33.27,30.25"
+ id="path702" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="382.36,-215.09 384.11,-208.09 391.24,-207.02 389.49,-214.01 "
+ id="polygon704" />
+ </g>
+ <!-- llfkmbodpifg -->
+ <g
+ id="node4"
+ class="node">
+ <title
+ id="title707">llfkmbodpifg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="177.32,-95.56 88.66,-108 0,-95.56 0.08,-75.44 177.23,-75.44 "
+ id="polygon709" />
+ <text
+ text-anchor="middle"
+ x="88.660004"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text711">ℚPinchHandler</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbodpifg -->
+ <g
+ id="edge3"
+ class="edge">
+ <title
+ id="title714">llfkmbbepmbg-&gt;llfkmbodpifg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 233.33,-142.15 c -34.69,12.27 -78.95,27.92 -109.33,38.66"
+ id="path716" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="244.78,-146.2 237.79,-147.97 233.47,-142.2 240.46,-140.42 "
+ id="polygon718" />
+ </g>
+ <!-- llfkmbnfping -->
+ <g
+ id="node5"
+ class="node">
+ <title
+ id="title721">llfkmbnfping</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="195.66,-72 277.66,-72 277.66,-108 195.66,-108 "
+ id="polygon723" />
+ <text
+ text-anchor="middle"
+ x="236.66"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text725">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbnfping -->
+ <g
+ id="edge4"
+ class="edge">
+ <title
+ id="title728">llfkmbbepmbg-&gt;llfkmbnfping</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 266.73,-133.1 c -6.04,8.45 -12.48,17.48 -17.85,25"
+ id="path730" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="273.78,-142.96 267.03,-140.41 266.8,-133.2 273.54,-135.76 "
+ id="polygon732" />
+ </g>
+ <!-- llfkmbbdfibg -->
+ <g
+ id="node7"
+ class="node">
+ <title
+ id="title735">llfkmbbdfibg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="295.66,-72 377.66,-72 377.66,-108 295.66,-108 "
+ id="polygon737" />
+ <text
+ text-anchor="middle"
+ x="336.66"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text739">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbbdfibg -->
+ <g
+ id="edge6"
+ class="edge">
+ <title
+ id="title742">llfkmbbepmbg-&gt;llfkmbbdfibg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 306.59,-133.1 c 6.03,8.45 12.48,17.48 17.85,25"
+ id="path744" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="299.54,-142.96 299.77,-135.76 306.52,-133.2 306.28,-140.41 "
+ id="polygon746" />
+ </g>
+ <!-- llfkmbodeang -->
+ <g
+ id="node9"
+ class="node">
+ <title
+ id="title749">llfkmbodeang</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="440.66,-72 522.66,-72 522.66,-108 440.66,-108 "
+ id="polygon751" />
+ <text
+ text-anchor="middle"
+ x="481.66"
+ y="-85.330002"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text753">ℚRectangle</text>
+ </g>
+ <!-- llfkmbbepmbg&#45;&gt;llfkmbodeang -->
+ <g
+ id="edge8"
+ class="edge">
+ <title
+ id="title756">llfkmbbepmbg-&gt;llfkmbodeang</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 340.14,-141.8 c 31.61,11.35 71.02,25.49 100.22,35.98"
+ id="path758" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="328.86,-145.85 333.16,-140.06 340.16,-141.8 335.86,-147.59 "
+ id="polygon760" />
+ </g>
+ <!-- llfkmbbfjjgg -->
+ <g
+ id="node6"
+ class="node">
+ <title
+ id="title763">llfkmbbfjjgg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="233.07,-23.56 147.66,-36 62.25,-23.56 62.33,-3.44 232.99,-3.44 "
+ id="polygon765" />
+ <text
+ text-anchor="middle"
+ x="147.66"
+ y="-13.33"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text767">ℚDragHandler</text>
+ </g>
+ <!-- llfkmbnfping&#45;&gt;llfkmbbfjjgg -->
+ <g
+ id="edge5"
+ class="edge">
+ <title
+ id="title770">llfkmbnfping-&gt;llfkmbbfjjgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 204.77,-63.92 c -12.86,10.12 -27.25,21.44 -38.37,30.18"
+ id="path772" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="213.95,-71.14 206.76,-70.57 204.52,-63.72 211.71,-64.29 "
+ id="polygon774" />
+ </g>
+ <!-- llfkmbbfibdg -->
+ <g
+ id="node8"
+ class="node">
+ <title
+ id="title777">llfkmbbfibdg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="422.07,-23.56 336.66,-36 251.25,-23.56 251.33,-3.44 421.99,-3.44 "
+ id="polygon779" />
+ <text
+ text-anchor="middle"
+ x="336.66"
+ y="-13.33"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text781">ℚDragHandler</text>
+ </g>
+ <!-- llfkmbbdfibg&#45;&gt;llfkmbbfibdg -->
+ <g
+ id="edge7"
+ class="edge">
+ <title
+ id="title784">llfkmbbdfibg-&gt;llfkmbbfibdg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 336.66,-58.81 c 0,7.77 0,15.86 0,22.71"
+ id="path786" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="336.66,-70.8 332.66,-64.8 336.66,-58.8 340.66,-64.8 "
+ id="polygon788" />
+ </g>
+ <!-- llfkmbcknglg -->
+ <g
+ id="node10"
+ class="node">
+ <title
+ id="title791">llfkmbcknglg</title>
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="611.07,-23.56 525.66,-36 440.25,-23.56 440.33,-3.44 610.99,-3.44 "
+ id="polygon793" />
+ <text
+ text-anchor="middle"
+ x="525.65997"
+ y="-13.33"
+ font-family="Times, serif"
+ font-size="9pt"
+ id="text795">ℚDragHandler</text>
+ </g>
+ <!-- llfkmbodeang&#45;&gt;llfkmbcknglg -->
+ <g
+ id="edge9"
+ class="edge">
+ <title
+ id="title798">llfkmbodeang-&gt;llfkmbcknglg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 499.32,-60.9 c 5.62,8.94 11.63,18.5 16.49,26.23"
+ id="path800" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="493.01,-70.93 492.82,-63.72 499.4,-60.77 499.59,-67.98 "
+ id="polygon802" />
+ </g>
+ <g
+ id="g11866"
+ class="edge"
+ transform="rotate(-90,623.51573,-276.02262)">
+ <title
+ id="title11860">llfkmbbephlg-&gt;llfkmbbeijgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 362.66,-274.81 c 0,7.77 0,15.86 0,22.71"
+ id="path11862" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="366.66,-280.8 362.66,-286.8 358.66,-280.8 362.66,-274.8 "
+ id="polygon11864" />
+ </g>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 708.8157,-33.802688 c 0,-1.93521 -13.67346,-3.50801 -30.51031,-3.50801 -16.83686,0 -30.51503,1.5728 -30.51503,3.50801 0,0 0,31.5378501 0,31.5378501 0,1.93522003 13.67817,3.50801 30.51503,3.50801 16.83685,0 30.51031,-1.57278997 30.51031,-3.50801 0,0 0,-31.5378501 0,-31.5378501"
+ id="path12337"
+ style="stroke-width:0.568213" />
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 708.8157,-33.802688 c 0,1.92838 -13.67346,3.50116 -30.51031,3.50116 -16.83686,0 -30.51503,-1.57278 -30.51503,-3.50116"
+ id="path12339"
+ style="stroke-width:0.568213" />
+ <text
+ text-anchor="middle"
+ x="678.23846"
+ y="-14.011026"
+ font-family="Times, serif"
+ font-size="6pt"
+ id="text12341"
+ style="stroke-width:0.681807">currentPoints</text>
+ <g
+ id="g14256"
+ class="edge"
+ transform="rotate(-90,507.65517,-314.66065)">
+ <title
+ id="title14250">llfkmbbephlg-&gt;llfkmbbeijgg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 362.66,-274.81 c 0,7.77 0,15.86 0,22.71"
+ id="path14252" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="362.66,-286.8 358.66,-280.8 362.66,-274.8 366.66,-280.8 "
+ id="polygon14254" />
+ </g>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 631.59317,-188.30128 c 0,-1.93521 -13.67346,-3.50801 -30.51031,-3.50801 -16.83686,0 -30.51503,1.5728 -30.51503,3.50801 0,0 0,31.53785 0,31.53785 0,1.93522 13.67817,3.50801 30.51503,3.50801 16.83685,0 30.51031,-1.57279 30.51031,-3.50801 0,0 0,-31.53785 0,-31.53785"
+ id="path14258"
+ style="stroke-width:0.568213" />
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 631.59317,-188.30128 c 0,1.92838 -13.67346,3.50116 -30.51031,3.50116 -16.83686,0 -30.51503,-1.57278 -30.51503,-3.50116"
+ id="path14260"
+ style="stroke-width:0.568213" />
+ <text
+ text-anchor="middle"
+ x="601.01593"
+ y="-168.50961"
+ font-family="Times, serif"
+ font-size="6pt"
+ id="text14262"
+ style="stroke-width:0.681807">targetItems</text>
+ <g
+ id="g3826"
+ class="edge"
+ transform="rotate(180,500.1871,-52.761609)">
+ <title
+ id="title3820">llfkmbodeang-&gt;llfkmbcknglg</title>
+ <path
+ fill="none"
+ stroke="#000000"
+ d="m 499.32,-60.9 c 5.62,8.94 11.63,18.5 16.49,26.23"
+ id="path3822" />
+ <polygon
+ fill="none"
+ stroke="#000000"
+ points="492.82,-63.72 499.4,-60.77 499.59,-67.98 493.01,-70.93 "
+ id="polygon3824" />
+ </g>
+ </g>
+ <g
+ id="g2388"
+ transform="translate(166.85425,118.15234)">
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.869398;stroke-linecap:square;stroke-dasharray:0.869398, 0.869398;stroke-opacity:1"
+ id="rect981"
+ width="115.87793"
+ height="32.582088"
+ x="-181.46954"
+ y="-115.9365"
+ ry="0"
+ transform="matrix(1,0,-0.22867874,0.97350194,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9pt;line-height:125%;font-family:Times, serif;-inkscape-font-specification:'Times, serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ x="-149.44366"
+ y="-93.742676"
+ id="text1897"><tspan
+ sodipodi:role="line"
+ id="tspan1895"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9pt;font-family:Times, serif;-inkscape-font-specification:'Times, serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="-149.44366"
+ y="-93.742676">QGuiApplication</tspan></text>
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576)"
+ d="m 508.49821,147.40834 c -5.01114,-15.80414 29.88553,-12.14178 19.22974,-0.30829"
+ id="path2661"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 529.10578,290.07508 c 2.22687,-20.59627 43.00062,-73.20365 2.77101,-64.44971"
+ id="path9238"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="495.45242"
+ y="108.62244"
+ id="text9334"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="495.45242"
+ y="108.62244"
+ id="tspan9332">③ deliverPointerEvent()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="495.45242"
+ y="119.57681"
+ id="tspan1575">④ deliverUpdatedPoints()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="495.45242"
+ y="130.53119"
+ id="tspan9365">⑤ localizePointerEvent()</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576)"
+ d="m 546.28994,291.07097 c -3.52959,-16.19952 30.87947,-9.32879 19.17598,1.46963"
+ id="path14423"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="553.95435"
+ y="276.75214"
+ id="text14441"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="553.95435"
+ y="276.75214"
+ sodipodi:role="line"
+ id="tspan2603">⑧ setActive() </tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.03579;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.03579, 1.03579;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#Arrow5)"
+ d="M 249.32923,23.153194 H 125.81655"
+ id="path1311" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="129.35161"
+ y="18.770849"
+ id="text1315"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="129.35161"
+ y="18.770849"
+ id="tspan1317">① event(QTouchEvent*)</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.03579;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.03579, 1.03579;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#Arrow5)"
+ d="M 480.13219,146.11428 434.01617,42.608119"
+ id="path2865"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="224.50352"
+ y="-380.62888"
+ id="text2981"
+ transform="rotate(65.571486)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="224.50352"
+ y="-380.62888"
+ id="tspan2979">② event(QTouchEvent*)</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4-5)"
+ d="m 442.97658,187.15842 c -50.02267,78.60672 40.30509,72.83709 29.70231,109.51513"
+ id="path9238-5"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="490.02765"
+ y="220.77097"
+ id="text9304-6"
+ transform="rotate(6.9725705)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:end;text-anchor:end;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="490.02765"
+ y="220.77097"
+ id="tspan9302"> ⑥ handlePointerEvent()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:end;text-anchor:end;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="490.02765"
+ y="231.72534"
+ id="tspan2397">⑦ wantsPointerEvent()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:end;text-anchor:end;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="490.02765"
+ y="242.6797"
+ id="tspan1147">⑬ onGrabChanged()</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:end;text-anchor:end;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="490.02765"
+ y="252.68085"
+ id="tspan2371" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="635.83441"
+ y="282.59363"
+ id="text2293"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="635.83441"
+ y="282.59363"
+ id="tspan2291">⑨ onActiveChanged()</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 621.84617,274.48471 c 33.3115,8.38416 -22.06557,12.65724 -23.12936,24.29582"
+ id="path2399"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="553.40424"
+ y="227.66728"
+ id="text2575"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="553.40424"
+ y="227.66728"
+ id="tspan2573">⑩ activeChanged Ⓢ</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="553.40424"
+ y="238.62166"
+ id="tspan2601">⑪ setColor()</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#808080;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text3431"
+ transform="rotate(-38.038218,476.61944,239.40311)"><textPath
+ xlink:href="#path9238-5"
+ id="textPath3609"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#808080;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ id="tspan3429">QTouchEvent*</tspan></textPath></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text3832"
+ transform="rotate(58.431196)"
+ x="474.64865"
+ y="-273.09793"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ id="tspan3828">target</tspan></text>
+ <circle
+ id="path4083"
+ style="fill:#000000;stroke:#e6a11b;stroke-width:0.750085"
+ cx="536.95331"
+ cy="217.47479"
+ r="0.0092422031" />
+ <circle
+ id="path4109"
+ style="fill:#000000;stroke:#e6a11b;stroke-width:0.750085"
+ cx="550.58368"
+ cy="218.91232"
+ r="0.0092422031" />
+ <circle
+ id="path4135"
+ style="fill:#000000;stroke:#e6a11b;stroke-width:0.750085"
+ cx="584.84467"
+ cy="-85.462952"
+ r="0.0092422031" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#1c1be6;stroke-width:1.00011;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.00011, 1.00011;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1576-4)"
+ d="m 588.30987,191.03752 c -32.55329,-6.31366 -64.31079,-1.46976 -66.079,-13.41654"
+ id="path1091"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;line-height:125%;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="592.49213"
+ y="194.76711"
+ id="text1121"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6pt;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#1c1be6;fill-opacity:1;stroke:none;stroke-width:0.750085px"
+ x="592.49213"
+ y="194.76711"
+ id="tspan1119">⑫ grabChanged Ⓢ</tspan></text>
+</svg>
diff --git a/src/quick/doc/src/internal/pinchAndDragHandlers.dot b/src/quick/doc/src/internal/pinchAndDragHandlers.dot
new file mode 100644
index 0000000000..f1b5182a0d
--- /dev/null
+++ b/src/quick/doc/src/internal/pinchAndDragHandlers.dot
@@ -0,0 +1,30 @@
+digraph {
+ llfkmbbephlg[label="ResizeItemToWindow_QMLTYPE_1", shape="tab"]
+ llfkmbbephlg -> llfkmbbeijgg[arrowtail=odiamond, dir=back]
+
+ llfkmbbeijgg[label="ℚRootItem", shape="box"]
+
+ llfkmbbepmbg[label="ℚRectangle", shape="box"]
+ llfkmbbeijgg -> llfkmbbepmbg[arrowtail=odiamond, dir=back]
+
+ llfkmbodpifg[label="ℚPinchHandler", shape="house"]
+ llfkmbbepmbg -> llfkmbodpifg[arrowtail=odiamond, dir=back]
+ llfkmbnfping[label="ℚRectangle", shape="box"]
+ llfkmbbepmbg -> llfkmbnfping[arrowtail=odiamond, dir=back]
+
+ llfkmbbfjjgg[label="ℚDragHandler", shape="house"]
+ llfkmbnfping -> llfkmbbfjjgg[arrowtail=odiamond, dir=back]
+ llfkmbbdfibg[label="ℚRectangle", shape="box"]
+ llfkmbbepmbg -> llfkmbbdfibg[arrowtail=odiamond, dir=back]
+
+ llfkmbbfibdg[label="ℚDragHandler", shape="house"]
+ llfkmbbdfibg -> llfkmbbfibdg[arrowtail=odiamond, dir=back]
+ llfkmbodeang[label="ℚRectangle", shape="box"]
+ llfkmbbepmbg -> llfkmbodeang[arrowtail=odiamond, dir=back]
+
+ llfkmbcknglg[label="ℚDragHandler", shape="house"]
+ llfkmbodeang -> llfkmbcknglg[arrowtail=odiamond, dir=back]
+ llfkmbclplkg[label="ℚDeliveryAgent", shape="invhouse"]
+ llfkmbbeijgg -> llfkmbclplkg[arrowtail=odiamond, dir=back]
+
+}
diff --git a/src/quick/doc/src/internal/pinchAndDragHandlers.svg b/src/quick/doc/src/internal/pinchAndDragHandlers.svg
new file mode 100644
index 0000000000..674315d5d2
--- /dev/null
+++ b/src/quick/doc/src/internal/pinchAndDragHandlers.svg
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Pages: 1 -->
+<svg width="619pt" height="332pt"
+ viewBox="0.00 0.00 619.07 332.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 328)">
+<polygon fill="white" stroke="none" points="-4,4 -4,-328 615.07,-328 615.07,4 -4,4"/>
+<!-- llfkmbbephlg -->
+<g id="node1" class="node">
+<title>llfkmbbephlg</title>
+<polygon fill="none" stroke="black" points="474.53,-324 262.78,-324 262.78,-328 250.78,-328 250.78,-288 474.53,-288 474.53,-324"/>
+<polyline fill="none" stroke="black" points="250.78,-324 262.78,-324"/>
+<text text-anchor="middle" x="362.66" y="-300.95" font-family="Times,serif" font-size="9pt">ResizeItemToWindow_QMLTYPE_1</text>
+</g>
+<!-- llfkmbbeijgg -->
+<g id="node2" class="node">
+<title>llfkmbbeijgg</title>
+<polygon fill="none" stroke="black" points="402.53,-252 322.78,-252 322.78,-216 402.53,-216 402.53,-252"/>
+<text text-anchor="middle" x="362.66" y="-229.32" font-family="Times,serif" font-size="9pt">ℚRootItem</text>
+</g>
+<!-- llfkmbbephlg&#45;&gt;llfkmbbeijgg -->
+<g id="edge1" class="edge">
+<title>llfkmbbephlg&#45;&gt;llfkmbbeijgg</title>
+<path fill="none" stroke="black" d="M362.66,-274.81C362.66,-267.04 362.66,-258.95 362.66,-252.1"/>
+<polygon fill="none" stroke="black" points="362.66,-274.8 366.66,-280.8 362.66,-286.8 358.66,-280.8 362.66,-274.8"/>
+</g>
+<!-- llfkmbbepmbg -->
+<g id="node3" class="node">
+<title>llfkmbbepmbg</title>
+<polygon fill="none" stroke="black" points="327.66,-180 245.66,-180 245.66,-144 327.66,-144 327.66,-180"/>
+<text text-anchor="middle" x="286.66" y="-157.32" font-family="Times,serif" font-size="9pt">ℚRectangle</text>
+</g>
+<!-- llfkmbbeijgg&#45;&gt;llfkmbbepmbg -->
+<g id="edge2" class="edge">
+<title>llfkmbbeijgg&#45;&gt;llfkmbbepmbg</title>
+<path fill="none" stroke="black" d="M334.28,-206.87C324.67,-198.01 314.18,-188.35 305.49,-180.35"/>
+<polygon fill="none" stroke="black" points="334.38,-206.96 341.51,-208.08 343.21,-215.09 336.09,-213.96 334.38,-206.96"/>
+</g>
+<!-- llfkmbclplkg -->
+<g id="node11" class="node">
+<title>llfkmbclplkg</title>
+<polygon fill="none" stroke="black" points="345.8,-156.44 439.66,-144 533.52,-156.44 533.43,-176.56 345.89,-176.56 345.8,-156.44"/>
+<text text-anchor="middle" x="439.66" y="-157.32" font-family="Times,serif" font-size="9pt">ℚDeliveryAgent</text>
+</g>
+<!-- llfkmbbeijgg&#45;&gt;llfkmbclplkg -->
+<g id="edge10" class="edge">
+<title>llfkmbbeijgg&#45;&gt;llfkmbclplkg</title>
+<path fill="none" stroke="black" d="M391.18,-207.07C402.46,-196.82 414.97,-185.45 424.45,-176.82"/>
+<polygon fill="none" stroke="black" points="391.24,-207.02 389.49,-214.01 382.36,-215.09 384.11,-208.09 391.24,-207.02"/>
+</g>
+<!-- llfkmbodpifg -->
+<g id="node4" class="node">
+<title>llfkmbodpifg</title>
+<polygon fill="none" stroke="black" points="177.32,-95.56 88.66,-108 0,-95.56 0.08,-75.44 177.23,-75.44 177.32,-95.56"/>
+<text text-anchor="middle" x="88.66" y="-85.33" font-family="Times,serif" font-size="9pt">ℚPinchHandler</text>
+</g>
+<!-- llfkmbbepmbg&#45;&gt;llfkmbodpifg -->
+<g id="edge3" class="edge">
+<title>llfkmbbepmbg&#45;&gt;llfkmbodpifg</title>
+<path fill="none" stroke="black" d="M233.33,-142.15C198.64,-129.88 154.38,-114.23 124,-103.49"/>
+<polygon fill="none" stroke="black" points="233.47,-142.2 240.46,-140.42 244.78,-146.2 237.79,-147.97 233.47,-142.2"/>
+</g>
+<!-- llfkmbnfping -->
+<g id="node5" class="node">
+<title>llfkmbnfping</title>
+<polygon fill="none" stroke="black" points="277.66,-108 195.66,-108 195.66,-72 277.66,-72 277.66,-108"/>
+<text text-anchor="middle" x="236.66" y="-85.33" font-family="Times,serif" font-size="9pt">ℚRectangle</text>
+</g>
+<!-- llfkmbbepmbg&#45;&gt;llfkmbnfping -->
+<g id="edge4" class="edge">
+<title>llfkmbbepmbg&#45;&gt;llfkmbnfping</title>
+<path fill="none" stroke="black" d="M266.73,-133.1C260.69,-124.65 254.25,-115.62 248.88,-108.1"/>
+<polygon fill="none" stroke="black" points="266.8,-133.2 273.54,-135.76 273.78,-142.96 267.03,-140.41 266.8,-133.2"/>
+</g>
+<!-- llfkmbbdfibg -->
+<g id="node7" class="node">
+<title>llfkmbbdfibg</title>
+<polygon fill="none" stroke="black" points="377.66,-108 295.66,-108 295.66,-72 377.66,-72 377.66,-108"/>
+<text text-anchor="middle" x="336.66" y="-85.33" font-family="Times,serif" font-size="9pt">ℚRectangle</text>
+</g>
+<!-- llfkmbbepmbg&#45;&gt;llfkmbbdfibg -->
+<g id="edge6" class="edge">
+<title>llfkmbbepmbg&#45;&gt;llfkmbbdfibg</title>
+<path fill="none" stroke="black" d="M306.59,-133.1C312.62,-124.65 319.07,-115.62 324.44,-108.1"/>
+<polygon fill="none" stroke="black" points="306.52,-133.2 306.28,-140.41 299.54,-142.96 299.77,-135.76 306.52,-133.2"/>
+</g>
+<!-- llfkmbodeang -->
+<g id="node9" class="node">
+<title>llfkmbodeang</title>
+<polygon fill="none" stroke="black" points="522.66,-108 440.66,-108 440.66,-72 522.66,-72 522.66,-108"/>
+<text text-anchor="middle" x="481.66" y="-85.33" font-family="Times,serif" font-size="9pt">ℚRectangle</text>
+</g>
+<!-- llfkmbbepmbg&#45;&gt;llfkmbodeang -->
+<g id="edge8" class="edge">
+<title>llfkmbbepmbg&#45;&gt;llfkmbodeang</title>
+<path fill="none" stroke="black" d="M340.14,-141.8C371.75,-130.45 411.16,-116.31 440.36,-105.82"/>
+<polygon fill="none" stroke="black" points="340.16,-141.8 335.86,-147.59 328.86,-145.85 333.16,-140.06 340.16,-141.8"/>
+</g>
+<!-- llfkmbbfjjgg -->
+<g id="node6" class="node">
+<title>llfkmbbfjjgg</title>
+<polygon fill="none" stroke="black" points="233.07,-23.56 147.66,-36 62.25,-23.56 62.33,-3.44 232.99,-3.44 233.07,-23.56"/>
+<text text-anchor="middle" x="147.66" y="-13.33" font-family="Times,serif" font-size="9pt">ℚDragHandler</text>
+</g>
+<!-- llfkmbnfping&#45;&gt;llfkmbbfjjgg -->
+<g id="edge5" class="edge">
+<title>llfkmbnfping&#45;&gt;llfkmbbfjjgg</title>
+<path fill="none" stroke="black" d="M204.77,-63.92C191.91,-53.8 177.52,-42.48 166.4,-33.74"/>
+<polygon fill="none" stroke="black" points="204.52,-63.72 211.71,-64.29 213.95,-71.14 206.76,-70.57 204.52,-63.72"/>
+</g>
+<!-- llfkmbbfibdg -->
+<g id="node8" class="node">
+<title>llfkmbbfibdg</title>
+<polygon fill="none" stroke="black" points="422.07,-23.56 336.66,-36 251.25,-23.56 251.33,-3.44 421.99,-3.44 422.07,-23.56"/>
+<text text-anchor="middle" x="336.66" y="-13.33" font-family="Times,serif" font-size="9pt">ℚDragHandler</text>
+</g>
+<!-- llfkmbbdfibg&#45;&gt;llfkmbbfibdg -->
+<g id="edge7" class="edge">
+<title>llfkmbbdfibg&#45;&gt;llfkmbbfibdg</title>
+<path fill="none" stroke="black" d="M336.66,-58.81C336.66,-51.04 336.66,-42.95 336.66,-36.1"/>
+<polygon fill="none" stroke="black" points="336.66,-58.8 340.66,-64.8 336.66,-70.8 332.66,-64.8 336.66,-58.8"/>
+</g>
+<!-- llfkmbcknglg -->
+<g id="node10" class="node">
+<title>llfkmbcknglg</title>
+<polygon fill="none" stroke="black" points="611.07,-23.56 525.66,-36 440.25,-23.56 440.33,-3.44 610.99,-3.44 611.07,-23.56"/>
+<text text-anchor="middle" x="525.66" y="-13.33" font-family="Times,serif" font-size="9pt">ℚDragHandler</text>
+</g>
+<!-- llfkmbodeang&#45;&gt;llfkmbcknglg -->
+<g id="edge9" class="edge">
+<title>llfkmbodeang&#45;&gt;llfkmbcknglg</title>
+<path fill="none" stroke="black" d="M499.32,-60.9C504.94,-51.96 510.95,-42.4 515.81,-34.67"/>
+<polygon fill="none" stroke="black" points="499.4,-60.77 499.59,-67.98 493.01,-70.93 492.82,-63.72 499.4,-60.77"/>
+</g>
+</g>
+</svg>
diff --git a/src/quick/doc/src/internal/textEdit.dot b/src/quick/doc/src/internal/textEdit.dot
new file mode 100644
index 0000000000..19986bcc21
--- /dev/null
+++ b/src/quick/doc/src/internal/textEdit.dot
@@ -0,0 +1,52 @@
+digraph G {
+ node [
+ shape=record
+ ]
+
+ textedit[label="ℚTextEdit"]
+ texteditpriv[label="ℚTextEditPrivate"]
+ texteditextra[label="{ℚTextEditPrivate::ExtraData|padding...}"]
+ textctrl[label="ℚTextControl"]
+ qqpxm[label="ℚPixmap"]
+
+ subgraph cluster_1 {
+ label = "swappable document"
+ color=green
+
+ doc[label="QTextDocument"]
+ docpriv[label="QTextDocumentPrivate"]
+ doclayout[label="QTextDocumentLayout"]
+ qqtih[label="{ℚTextImageHandler||QSizeF intrinsicSize(doc, pos, format)}"]
+
+ doc -> docpriv [arrowtail=diamond, dir=back];
+ doc -> doclayout[arrowhead=vee, label="creates lazily", style="dotted", color="blue"]
+ }
+
+ subgraph cluster_2 {
+ label = "lazily constructed"
+ color=grey
+
+ qqdoc[label="{ℚTextDocument||textDocument()\nsetTextDocument()}"]
+ qqdocpriv[label="ℚTextDocumentPrivate"]
+
+ qqdoc -> qqdocpriv[arrowtail=diamond, dir=back]
+ }
+
+ textedit -> texteditpriv[arrowtail=diamond, dir=back]
+ texteditpriv -> texteditextra[arrowtail=diamond, dir=back]
+ texteditpriv -> doc[arrowtail=odiamond, dir=back]
+ texteditpriv -> qqdoc[arrowtail=odiamond, dir=back]
+ texteditpriv -> textctrl[arrowtail=diamond, dir=back]
+ texteditpriv -> qqpxm[arrowtail=diamond, dir=back, headlabel = "n", label="pixmapsInProgress"]
+ texteditpriv -> qqtih[arrowhead=vee, label="creates", style="dotted", color="blue"]
+ texteditpriv -> qqdoc[arrowhead=vee, label="creates", style="dotted", color="blue"]
+ texteditpriv -> doc[arrowhead=vee, label="creates", style="dotted", color="blue"]
+ textedit -> qqpxm[arrowhead=vee, label="creates", style="dotted", color="blue"]
+ qqtih -> doc[arrowhead=vee, label="parent", style="dashed"]
+ doc -> textedit[arrowhead=vee, label="parent", style="dashed"]
+ qqdoc -> textedit[arrowhead=vee, label="parent", style="dashed"]
+ doclayout -> doc[arrowhead=vee, label="parent", style="dashed"]
+ docpriv -> doclayout[arrowtail=diamond, dir=back]
+ doclayout -> qqtih[arrowtail=odiamond, dir=back, label="registered handler", style="dashed"] # storage is complex
+ qqdocpriv -> doc[arrowtail=odiamond, dir=back, taillabel="QPointer"]
+}
diff --git a/src/quick/doc/src/qmltypereference.qdoc b/src/quick/doc/src/qmltypereference.qdoc
index a2c913de49..db750bf077 100644
--- a/src/quick/doc/src/qmltypereference.qdoc
+++ b/src/quick/doc/src/qmltypereference.qdoc
@@ -17,11 +17,11 @@ import QtQuick
\endqml
Visit the \l {Qt Quick} module documentation for more
-information about the concepts which are central to \c QtQuick.
+information about the concepts that are central to \c QtQuick.
\section1 Submodules
- Qt Quick includes several submodules which contain additional types.
+ Qt Quick includes several submodules that contain additional types:
\list
\li \l{Qt Quick Local Storage QML Types}{Local Storage} - a submodule
@@ -33,6 +33,12 @@ information about the concepts which are central to \c QtQuick.
\li \l{Qt Quick Layouts QML Types}{Layouts} - contains types that are used
to arrange items in the user interface
\li \l{Qt Quick Test QML Types}{Tests} - types for testing QML applications.
+ \li \l{Qt Quick Effects QML Types}{Effects} - provides types for applying
+ one or more simple graphical effects to Qt Quick items.
+ \li \l{Qt Quick Shapes QML Types}{Shapes} - provides types for rendering vector shapes in
+ a Qt Quick scene.
+ \li \l{Qt Quick Vector Image QML Types}{Vector Image} - provides types for displaying vector
+ image files.
\endlist
\target value-types
@@ -48,7 +54,7 @@ In addition, the \c QtQuick import provides the following value types:
\section1 Object Types
Most object types provided by the \c QtQuick import are based on the \l{Item}
-type, which itself derives from \l{QtQml::QtObject}{QtObject}. \l{Qt QML QML
+type, which itself derives from \l{QtQml::QtObject}{QtObject}. \l{Qt Qml QML
Types#Object Types} {QML object types} provided by the Qt QML module (such as
\l{QtQml::QtObject}{QtObject} and \l{QtQml::Component}{Component}) are also
available when you import \c QtQuick.
@@ -108,7 +114,7 @@ available when you import \c QtQuick.
\section1 SVG Color Reference
The following table lists the available
- \l {http://www.w3.org/TR/SVG/types.html#ColorKeywords}{SVG colors}:
+ \l {https://www.w3.org/TR/css-color-3/#svg-color}{SVG colors}:
\include svg-colors.qdocinc
@@ -151,13 +157,21 @@ available when you import \c QtQuick.
\li \l bool \c font.kerning
\li \l bool \c font.preferShaping
\li \l enumeration \c font.hintingPreference
+ \li \c object \l [QML] {QtQuick::Text::}{font.features}
\li \l string \c font.styleName
+ \li \c object \c [QML] {QtQuick::Text::}{font.variableAxes}
+ \li \l bool \c font.contextFontMerging
+ \li \l bool \c font.preferTypoLineMetrics
\endlist
Example:
- \qml
- Text { font.family: "Helvetica"; font.pointSize: 13; font.bold: true }
- \endqml
+
+ \snippet qml/font.qml text
+
+ As \c font is a \l {QML_STRUCTURED_VALUE}{structured value} type, it can
+ also be constructed with a JavaScript object:
+
+ \snippet qml/font.qml structured-value-construction
When integrating with C++, note that any QFont value
\l{qtqml-cppintegration-data.html}{passed into QML from C++} is automatically
@@ -165,71 +179,36 @@ available when you import \c QtQuick.
This value type is provided by the QtQuick import.
- Font weighting is classified on a scale from 0 to 99, where a weight of 0 is ultralight,
- and 99 is extremely black. The following values are supported:
+ Numerical values for font weights follow the CSS specification, where a
+ weight of 100 is extremely light, and 900 is extremely bold.
+ The following values are supported:
- \table
- \row
- \li \c Font.Thin
- \li 0
- \row
- \li \c Font.ExtraLight
- \li 12
- \row
- \li \c Font.Light
- \li 25
- \row
- \li \c Font.Normal
- \li 50
- \row
- \li \c Font.Medium
- \li 57
- \row
- \li \c Font.DemiBold
- \li 63
- \row
- \li \c Font.Bold
- \li 75
- \row
- \li \c Font.ExtraBold
- \li 81
- \row
- \li \c Font.Black
- \li 87
- \endtable
+ \value Font.Thin 100
+ \value Font.ExtraLight 200
+ \value Font.Light 300
+ \value Font.Normal 400
+ \value Font.Medium 500
+ \value Font.DemiBold 600
+ \value Font.Bold 700
+ \value Font.ExtraBold 800
+ \value Font.Black 900
Capitalization supports the following values:
- \table
- \row
- \li \c Font.MixedCase
- \li No capitalization change is applied.
- \row
- \li \c Font.AllUppercase
- \li Alters the text to be rendered in all uppercase type.
- \row
- \li \c Font.AllLowercase
- \li Alters the text to be rendered in all lowercase type.
- \row
- \li \c Font.SmallCaps
- \li Alters the text to be rendered in small-caps type.
- \row
- \li \c Font.Capitalize
- \li Alters the text to be rendered with the first character of each word as an uppercase character.
- \endtable
+ \value Font.MixedCase No capitalization change is applied.
+ \value Font.AllUppercase Alters the text to be rendered in all uppercase type.
+ \value Font.AllLowercase Alters the text to be rendered in all lowercase type.
+ \value Font.SmallCaps Alters the text to be rendered in small-caps type.
+ \value Font.Capitalize Alters the text to be rendered with the first character of each word as an uppercase character.
Setting the hinting preference only has an effect when using the "NativeRendering" render type.
The property supports the following values:
- \list
- \value Font.PreferDefaultHinting - Use the default hinting level for the target platform.
- \value Font.PreferNoHinting - If possible, render text without hinting the outlines
- of the glyphs.
- \value Font.PreferVerticalHinting - If possible, render text with no horizontal hinting,
- but align glyphs to the pixel grid in the vertical direction.
- \value Font.PreferFullHinting - If possible, render text with hinting in both horizontal and
- vertical directions.
- \endlist
+ \value Font.PreferDefaultHinting Use the default hinting level for the target platform.
+ \value Font.PreferNoHinting If possible, render text without hinting the outlines of the glyphs.
+ \value Font.PreferVerticalHinting If possible, render text with no horizontal hinting,
+ but align glyphs to the pixel grid in the vertical direction.
+ \value Font.PreferFullHinting If possible, render text with hinting in both horizontal and vertical directions.
\sa {QML Value Types}
*/
diff --git a/src/quick/doc/src/qtquick-android.qdoc b/src/quick/doc/src/qtquick-android.qdoc
new file mode 100644
index 0000000000..b21378565d
--- /dev/null
+++ b/src/quick/doc/src/qtquick-android.qdoc
@@ -0,0 +1,14 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+\page qtquick-android-classes.html
+\title Qt Quick Android Classes
+\summary The Qt Quick module provides classes for embedding Qt Quick in Android Applications.
+
+ \note Classes under this module requires \l{Qt for Android}.
+
+ \annotatedlist qt_android_classes
+
+ For more information on Qt Quick module, see the \l{Qt Quick} module documentation.
+*/
diff --git a/src/quick/doc/src/qtquick-how-tos.qdoc b/src/quick/doc/src/qtquick-how-tos.qdoc
new file mode 100644
index 0000000000..c030b071e2
--- /dev/null
+++ b/src/quick/doc/src/qtquick-how-tos.qdoc
@@ -0,0 +1,109 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \page qtquick-how-tos.html
+ \title Qt Quick How-tos
+
+ This page aims to provide an easily discoverable, useful reference that
+ shows the simplest and best way of performing specific tasks in Qt Quick.
+ Each solution provides QML and/or C++ code snippets where applicable, and
+ every snippet is automatically tested by Qt to ensure they remain
+ functional.
+
+ How do I:
+
+ \list
+ \li \l {Call a C++ function from QML when a Button is clicked}
+ \li \l {See which item has active focus}
+ \li \l {Create a time picker like Android's TimePickerDialog}
+ \li \l {Use a C++ enum in JavaScript}
+ \endlist
+
+
+ \section1 Call a C++ function from QML when a Button is clicked
+
+ Assuming that the C++ type should be globally available to the QML
+ files in the application, the simplest way is to make it a QML singleton
+ with \l QML_SINGLETON. For example, in the header file, \c backend.h:
+
+ \snippet how-tos/how-to-cpp-button/backend.h file
+
+ \c backend.cpp:
+
+ \snippet how-tos/how-to-cpp-button/backend.cpp file
+
+ You can then call that function from any QML file:
+
+ \snippet how-tos/how-to-cpp-button/Main.qml file
+
+ If the C++ type only needs to be available to a small set of QML files,
+ consider using \l QML_ELEMENT. For more ways of exposing C++ types to QML,
+ see \l {Choosing the Correct Integration Method Between C++ and QML}.
+
+ This example assumes that the \c Backend type is available in a QML module.
+ With CMake, this is done via \l qt_add_qml_module. For an example that
+ demonstrates this in detail, see \l {Building a QML application}.
+
+
+ \section1 See which item has active focus
+
+ Write a \l {Property change signal handlers}{property change signal handler}
+ for the window's \l {Window::}{activeFocusItem} property:
+
+ \snippet how-tos/how-to-qml/active-focus-debugging/ActiveFocusDebuggingMain.qml file
+
+ This will print the item which currently has active focus to the console.
+ To ensure that the output is useful, give each item a descriptive
+ \l {QtObject::}{objectName}.
+
+
+ \section1 Create a time picker like Android's TimePickerDialog
+
+ We've prepared an example that consists of a few
+ \l {https://code.qt.io/cgit/qt/qtdeclarative.git/tree/tests/auto/quick/doc/how-tos/how-to-qml/time-picker/TimeComponentLabel.qml?h=\QtMajorVersion.\QtMinorVersion}
+ {QML files} which demonstrate how to do this. They can be used
+ in your application in the following manner:
+
+ \snippet how-tos/how-to-qml/time-picker/TimePickerMain.qml file
+
+ \table
+ \row
+ \li \image how-to-time-picker-light.png
+ \caption TimePickerDialog in its light theme.
+ \li \image how-to-time-picker-dark.png
+ \caption TimePickerDialog in its dark theme.
+ \endtable
+
+
+ \section1 Use a C++ enum in JavaScript
+
+ To expose a C++ enum to JavaScript (that is, \l QJSEngine, not
+ \l QQmlEngine or \l QQmlApplicationEngine), use
+ \l QJSEngine::newQMetaObject():
+
+ \quotefromfile how-tos/how-to-cpp-enum-js/tst_how-to-cpp-enum-js.cpp
+ \skipto QJSEngine engine
+ \printuntil setProperty
+ \skipto Backend backend
+ \printuntil backend.load()
+
+ The enum can then be used from JavaScript:
+
+ \snippet how-tos/how-to-cpp-enum-js/script.mjs file
+
+ When using \l QQmlEngine or \l QQmlApplicationEngine, there are easier
+ options; see
+ \l {Choosing the Correct Integration Method Between C++ and QML}
+ for more information.
+
+ \c backend.h:
+
+ \snippet how-tos/how-to-cpp-enum-js/backend.h file
+
+ \c backend.cpp:
+
+ \snippet how-tos/how-to-cpp-enum-js/backend.cpp file
+
+ For more information, see \l {QObject Integration}.
+*/
diff --git a/src/quick/doc/src/qtquick.qdoc b/src/quick/doc/src/qtquick.qdoc
index 6797169312..0d0890398f 100644
--- a/src/quick/doc/src/qtquick.qdoc
+++ b/src/quick/doc/src/qtquick.qdoc
@@ -7,7 +7,7 @@
\brief The Qt Quick module implements the "standard library" for QML
The Qt Quick module is the standard library for writing QML applications.
-While the \l{Qt QML} module provides the QML engine and
+While the \l{Qt Qml} module provides the QML engine and
language infrastructure, the Qt Quick module provides all the basic
types necessary for creating user interfaces with QML. It
provides a visual canvas and includes types for creating and animating
@@ -61,8 +61,10 @@ shader effects.
{States, Transitions And Animations}
\li \l {Important Concepts In Qt Quick - Data - Models, Views and data Storage}
{Data - Models, Views and Data Storage}
- \li \l {Important Concepts In Qt Quick - Graphical Effects}{Particles And
- Graphical Effects}
+ \li \list \l {Important Concepts In Qt Quick - Graphical Effects}
+ {Particles And Graphical Effects}
+ \li \l MultiEffect
+ \endlist
\li \l {Important Concepts In Qt Quick - Convenience Types}
{Convenience Types}
\endlist
@@ -71,7 +73,7 @@ When using the Qt Quick module, you will need to know how to write QML
applications using the QML language. In particular, QML Basics and QML
Essentials from the \l{QML Applications} page.
-To find out more about using the QML language, see the \l{Qt QML} module documentation.
+To find out more about using the QML language, see the \l{Qt Qml} module documentation.
\section1 C++ Extension Points
@@ -99,9 +101,11 @@ To find out more about using the QML language, see the \l{Qt QML} module documen
\li \l {QML Applications}
- essential information for application development with QML and Qt
Quick
- \li \l {Qt QML}
+ \li \l {Qt Qml}
- documentation for the Qt QML module, which provides the QML engine
and language infrastructure
+ \li \l {Qt Quick How-tos}
+ - shows how to achieve specific tasks in Qt Quick
\endlist
\endlist
@@ -119,6 +123,8 @@ To find out more about using the QML language, see the \l{Qt QML} module documen
\li \l {Qt Quick QML Types}
- a list of QML types provided by the \c{QtQuick} import
\list
+ \li \l {Qt Quick Effects QML Types} {Effects}
+ - provides graphical effects to apply to Qt Quick items
\li \l {Qt Quick Local Storage QML Types} {Local Storage}
- a submodule containing a JavaScript interface for an SQLite
database
@@ -128,9 +134,22 @@ To find out more about using the QML language, see the \l{Qt QML} module documen
- provides layouts for arranging Qt Quick items
\li \l {Qt Quick Test QML Types} {Tests}
- contains types for writing unit test for a QML application
+ \li \l{Qt Quick Shapes QML Types}{Shapes}
+ - provides types for rendering vector shapes in a Qt Quick scene.
+ \li \l{Qt Quick Vector Image QML Types}{Vector Image} - provides types for displaying
+ vector image files.
\endlist
+ \li \l {Qt Quick Android Classes}
+ - provides classes for using QML with Java/Kotlin Android APIs.
\endlist
+\section1 Qt Academy Courses
+ \list
+ \li \l {https://www.qt.io/academy/course-catalog#introduction-to-qt-quick}
+ {Introduction to Qt Quick}
+ \endlist
+
+
\section1 Licenses and Attributions
Qt Quick is available under commercial licenses from \l{The Qt Company}.