| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the documentation of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:FDL$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU Free Documentation License Usage |
| ** Alternatively, this file may be used under the terms of the GNU Free |
| ** Documentation License version 1.3 as published by the Free Software |
| ** Foundation and appearing in the file included in the packaging of |
| ** this file. Please review the following information to ensure |
| ** the GNU Free Documentation License version 1.3 requirements |
| ** will be met: https://www.gnu.org/licenses/fdl-1.3.html. |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| /*! |
| \example draganddrop/draggableicons |
| \title Draggable Icons Example |
| |
| \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 |
| |
| 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. |
| |
| */ |