QT 拖拽复制数据

自定义数据类

#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()
{

}





扫描二维码关注公众号,回复: 2423251 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_17813937/article/details/80954903