自定义数据类
#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
注意不能直接返回 data,会异常结束,至于原因博主也不知道....
子类化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()
{
}