Drag and Drop Puzzle Example▲
Sélectionnez
/**
**************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** 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.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
***************************************************************************
*/
#include
"pieceslist.h"
#include <QDrag>
#include <QDragEnterEvent>
#include <QMimeData>
PiecesList::
PiecesList(int
pieceSize, QWidget *
parent)
:
QListWidget(parent), m_PieceSize(pieceSize)
{
setDragEnabled(true
);
setViewMode(QListView::
IconMode);
setIconSize(QSize(m_PieceSize, m_PieceSize));
setSpacing(10
);
setAcceptDrops(true
);
setDropIndicatorShown(true
);
}
void
PiecesList::
dragEnterEvent(QDragEnterEvent *
event)
{
if
(event-&
gt;mimeData()-&
gt;hasFormat(PiecesList::
puzzleMimeType()))
event-&
gt;accept();
else
event-&
gt;ignore();
}
void
PiecesList::
dragMoveEvent(QDragMoveEvent *
event)
{
if
(event-&
gt;mimeData()-&
gt;hasFormat(PiecesList::
puzzleMimeType())) {
event-&
gt;setDropAction(Qt::
MoveAction);
event-&
gt;accept();
}
else
{
event-&
gt;ignore();
}
}
void
PiecesList::
dropEvent(QDropEvent *
event)
{
if
(event-&
gt;mimeData()-&
gt;hasFormat(PiecesList::
puzzleMimeType())) {
QByteArray pieceData =
event-&
gt;mimeData()-&
gt;data(PiecesList::
puzzleMimeType());
QDataStream dataStream(&
amp;pieceData, QIODevice::
ReadOnly);
QPixmap pixmap;
QPoint location;
dataStream &
gt;&
gt; pixmap &
gt;&
gt; location;
addPiece(pixmap, location);
event-&
gt;setDropAction(Qt::
MoveAction);
event-&
gt;accept();
}
else
{
event-&
gt;ignore();
}
}
void
PiecesList::
addPiece(const
QPixmap &
amp;pixmap, const
QPoint &
amp;location)
{
QListWidgetItem *
pieceItem =
new
QListWidgetItem(this
);
pieceItem-&
gt;setIcon(QIcon(pixmap));
pieceItem-&
gt;setData(Qt::
UserRole, QVariant(pixmap));
pieceItem-&
gt;setData(Qt::
UserRole+
1
, location);
pieceItem-&
gt;setFlags(Qt::
ItemIsEnabled |
Qt::
ItemIsSelectable |
Qt::
ItemIsDragEnabled);
}
void
PiecesList::
startDrag(Qt::
DropActions /*supportedActions*/
)
{
QListWidgetItem *
item =
currentItem();
QByteArray itemData;
QDataStream dataStream(&
amp;itemData, QIODevice::
WriteOnly);
QPixmap pixmap =
qvariant_cast&
lt;QPixmap&
gt;(item-&
gt;data(Qt::
UserRole));
QPoint location =
item-&
gt;data(Qt::
UserRole+
1
).toPoint();
dataStream &
lt;&
lt; pixmap &
lt;&
lt; location;
QMimeData *
mimeData =
new
QMimeData;
mimeData-&
gt;setData(PiecesList::
puzzleMimeType(), itemData);
QDrag *
drag =
new
QDrag(this
);
drag-&
gt;setMimeData(mimeData);
drag-&
gt;setHotSpot(QPoint(pixmap.width()/
2
, pixmap.height()/
2
));
drag-&
gt;setPixmap(pixmap);
if
(drag-&
gt;exec(Qt::
MoveAction) ==
Qt::
MoveAction)
delete
takeItem(row(item));
}