QList Drag and Drop Example
Jump to navigation
Jump to search
Example of the simple moving items using drag & drop betweeen two or more QListViews.
listbox.h:
#ifndef LISTBOX_H<br />#define LISTBOX_H
#include <QtGui>
class ListBox : public QListWidget<br />{<br /> Q_OBJECT<br />public:<br /> ListBox(QWidget *parent);<br />protected:<br /> void dragMoveEvent(QDragMoveEvent *e);<br /> void dropEvent(QDropEvent *event);<br /> void startDrag(Qt::DropActions supportedActions);<br /> void dragEnterEvent(QDragEnterEvent *event);<br /> Qt::DropAction supportedDropActions();<br />signals:<br /> void itemDroped();<br />};
#endif // LISTBOX_H
listbox.cpp:
#include "listbox.h"
void ListBox::dragMoveEvent(QDragMoveEvent *e)<br />{<br /> if (e->mimeData()->hasFormat("application/x-item") && e->source() != this) {<br /> e->setDropAction(Qt::MoveAction);<br /> e->accept();<br /> } else<br /> e->ignore();
}
ListBox::ListBox(QWidget *parent) : QListWidget(parent)<br />{<br /> this->setViewMode(QListView::IconMode);<br /> this->setIconSize(QSize(55, 55));<br /> this->setSelectionMode(QAbstractItemView::SingleSelection);<br /> this->setDragEnabled(true);<br /> this->setDefaultDropAction(Qt::MoveAction);<br /> this->setAcceptDrops(true);<br /> this->setDropIndicatorShown(true);<br />}
void ListBox::dropEvent(QDropEvent *event)<br />{<br /> if (event->mimeData()->hasFormat("application/x-item")) {<br /> event->accept();<br /> event->setDropAction(Qt::MoveAction);<br /> QListWidgetItem *item = new QListWidgetItem;<br /> QString name = event->mimeData()->data("application/x-item");<br /> item->setText(name);<br /> item->setIcon(QIcon(":/images/iString")); //set path to image<br /> addItem(item);<br /> }<br /> else<br /> event->ignore();<br />}
void ListBox::startDrag(Qt::DropActions supportedActions)<br />{<br /> QListWidgetItem *item = currentItem();<br /> QMimeData *mimeData = new QMimeData;<br /> QByteArray ba;<br /> ba = item->text().toLatin1().data();<br /> mimeData->setData("application/x-item", ba);<br /> QDrag *drag = new QDrag(this);<br /> drag->setMimeData(mimeData);<br /> if (drag->exec(Qt::MoveAction) == Qt::MoveAction) {<br /> delete takeItem(row(item));<br /> emit itemDroped();<br /> }<br />}
void ListBox::dragEnterEvent(QDragEnterEvent *event)<br />{<br /> if (event->mimeData()->hasFormat("application/x-item"))<br /> event->accept();<br /> else<br /> event->ignore();<br />}
Qt::DropAction ListBox::supportedDropActions()<br />{<br /> return Qt::MoveAction;<br />}