自定义数据类
#ifndef DRAGDATA_H #define DRAGDATA_H #include <QObjectUserData> class DragData:public QObjectUserData { public: DragData(){} DragData(const DragData & data){ this->componentType = data.componentType; } public: QString componentType; }; #endif // DRAGDATA_H自定义Item
#ifndef DRAGITEM_H #define DRAGITEM_H #include <QListWidgetItem> #include "dragdata.h" class DragItem : public QListWidgetItem { public: explicit DragItem(const QString title, QListWidget *parent = 0) : QListWidgetItem(title,parent){} void SetUserData(QObjectUserData *data) { this->data = data; } QObjectUserData *GetUserData()const { return new DragData((const DragData&)*data); } private: QObjectUserData * data; }; #endif // DRAGITEM_H子类化QListWidget
#ifndef DRAGLIST_H #define DRAGLIST_H #include <QListWidget> class DragList : public QListWidget { Q_OBJECT public: explicit DragList(QWidget *parent = 0); protected: void mouseMoveEvent(QMouseEvent *e); private: QListWidgetItem *item; }; #endif // DRAGLIST_H #include "draglist.h" #include <QMouseEvent> #include <QMimeData> #include <QDrag> #include "dragitem.h" DragList::DragList(QWidget *parent) : QListWidget(parent) { setDragEnabled(true); connect(this,&DragList::itemPressed,this,[=](QListWidgetItem *item){ this->item = item; }); } void DragList::mouseMoveEvent(QMouseEvent *e) { if (e->buttons() & Qt::LeftButton && item !=NULL){ QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setUserData(0,((DragItem*)item)->GetUserData()); drag->setMimeData(mimeData); drag->exec(Qt::CopyAction); return; } QListWidget::mouseMoveEvent(e); }接收数据
#ifndef SCENE_H #define SCENE_H #include <QWidget> class Scene : public QWidget { Q_OBJECT public: explicit Scene(QWidget *parent = 0); protected: void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); }; #endif // SCENE_H #include "scene.h" #include <QtWidgets> #include "dragdata.h" Scene::Scene(QWidget *parent) : QWidget(parent) { setAcceptDrops(true); } void Scene::dragEnterEvent(QDragEnterEvent *event) { event->acceptProposedAction(); } void Scene::dropEvent(QDropEvent *event) { auto data = static_cast<DragData*>(event->mimeData()->userData(0)); qDebug()<<data->componentType; }测试
#include "mainwindow.h" #include <QtWidgets> #include "draglist.h" #include "dragitem.h" #include "dragdata.h" #include "scene.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { resize(500,500); Scene *scene = new Scene(this); scene->resize(width(),height()); DragList *list = new DragList(this); list->resize(200,500); DragItem *item = new DragItem("Image",list); auto data = new DragData; data->componentType ="Image"; item->SetUserData(data); list->addItem(item); } MainWindow::~MainWindow() { }