Revision control
++ // Copyright (C) 2016 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
++
++ /*!
++ \example draganddrop/draggableicons
++ \title Draggable Icons Example
++ \ingroup examples-user-input
++ \examplecategory {User Interface Components}
++
++ \brief The Draggable Icons example shows how to drag and drop image data between widgets
++ in the same application, and between different applications.
++
++ \image draggableicons-example.png
++ {Application with icons that respond to drag and drop events}
++
++ In many situations where drag and drop is used, the user starts dragging from
++ a particular widget and drops the payload onto another widget. In this example,
++ we subclass QLabel to create labels that we use as drag sources, and place them
++ inside \l{QWidget}s that serve as both containers and drop sites.
++
++ In addition, when a drag and drop operation occurs, we want to send more than
++ just an image. We also want to send information about where the user clicked in
++ the image so that the user can place it precisely on the drop target. This level
++ of detail means that we must create a custom MIME type for our data.
++
++ \section1 DragWidget Class Definition
++
++ The icon widgets that we use to display icons are subclassed from QLabel:
++
++ \snippet draganddrop/draggableicons/dragwidget.h 0
++
++ Since the QLabel class provides most of what we require for the icon, we
++ only need to reimplement the \l QWidget::mousePressEvent() to provide
++ drag and drop facilities.
++
++ \section1 DragWidget Class Implementation
++
++ The \c DragWidget constructor sets an attribute on the widget that ensures
++ that it will be deleted when it is closed:
++
++ \snippet draganddrop/draggableicons/dragwidget.cpp 0
++
++ To enable dragging from the icon, we need to act on a mouse press event.
++ We do this by reimplementing \l QWidget::mousePressEvent() and setting up
++ a QDrag object.
++
++ \snippet draganddrop/draggableicons/dragwidget.cpp 1
++
++ Since we will be sending pixmap data for the icon and information about the
++ user's click in the icon widget, we construct a QByteArray and package up the
++ details using a QDataStream.
++
++ For interoperability, drag and drop operations describe the data they contain
++ using MIME types. In Qt, we describe this data using a QMimeData object:
++
++ \snippet draganddrop/draggableicons/dragwidget.cpp 2
++
++ We choose an unofficial MIME type for this purpose, and supply the QByteArray
++ to the MIME data object.
++
++ The drag and drop operation itself is handled by a QDrag object:
++
++ \snippet draganddrop/draggableicons/dragwidget.cpp 3
++
++ Here, we pass the data to the drag object, set a pixmap that will be shown
++ alongside the cursor during the operation, and define the position of a hot
++ spot that places the position of this pixmap under the cursor.
++
++ */