Jump to content

QList Drag and Drop Example

From Qt Wiki
Revision as of 16:54, 28 June 2015 by Wieland (talk | contribs) (Cleanup)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

En Ar Bg De El Es Fa Fi Fr Hi Hu It Ja Kn Ko Ms Nl Pl Pt Ru Sq Th Tr Uk Zh

Example of the simple moving items using drag and drop betweeen two or more QListViews.

listbox.h:

#ifndef LISTBOX_H
#define LISTBOX_H

#include <QtGui>

class ListBox : public QListWidget
{
    Q_OBJECT
public:
    ListBox(QWidget* parent);
protected:
    void dragMoveEvent(QDragMoveEvent* e);
    void dropEvent(QDropEvent* event);
    void startDrag(Qt::DropActions supportedActions);
    void dragEnterEvent(QDragEnterEvent* event);
    Qt::DropAction supportedDropActions();
signals:
    void itemDroped();
};

#endif // LISTBOX_H


listbox.cpp:

#include "listbox.h"

void ListBox::dragMoveEvent(QDragMoveEvent* e)
{
    if (e->mimeData()->hasFormat("application/x-item") && e->source() != this) {
        e->setDropAction(Qt::MoveAction);
        e->accept();
    } else
        e->ignore();
}

ListBox::ListBox(QWidget* parent) 
    : QListWidget(parent)
{
    this->setViewMode(QListView::IconMode);
    this->setIconSize(QSize(55, 55));
    this->setSelectionMode(QAbstractItemView::SingleSelection);
    this->setDragEnabled(true);
    this->setDefaultDropAction(Qt::MoveAction);
    this->setAcceptDrops(true);
    this->setDropIndicatorShown(true);
}

void ListBox::dropEvent(QDropEvent* event)
{
    if (event->mimeData()->hasFormat("application/x-item")) {
        event->accept();
        event->setDropAction(Qt::MoveAction);
        QListWidgetItem *item = new QListWidgetItem;
        QString name = event->mimeData()->data("application/x-item");
        item->setText(name);
        item->setIcon(QIcon(":/images/iString")); //set path to image
        addItem(item);
    } else
        event->ignore();
}

void ListBox::startDrag(Qt::DropActions supportedActions)
{
    QListWidgetItem* item = currentItem();
    QMimeData* mimeData = new QMimeData;
    QByteArray ba;
    ba = item->text().toLatin1().data();
    mimeData->setData("application/x-item", ba);
    QDrag* drag = new QDrag(this);
    drag->setMimeData(mimeData);
    if (drag->exec(Qt::MoveAction) == Qt::MoveAction) {
        delete takeItem(row(item));
        emit itemDroped();
    }
}

void ListBox::dragEnterEvent(QDragEnterEvent* event)
{
    if (event->mimeData()->hasFormat("application/x-item"))
        event->accept();
    else
        event->ignore();
}

Qt::DropAction ListBox::supportedDropActions()
{
    return Qt::MoveAction;
}