拖动的对象:
#include "outlistitem.h"
#include "ui_outlistitem.h"OutListItem::OutListItem(QWidget *parent) :QWidget(parent),ui(new Ui::OutListItem)
{ui->setupUi(this);
}OutListItem::~OutListItem()
{delete ui;
}void OutListItem::mousePressEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){QDrag *drag = new QDrag(this);QMimeData *mimeData = new QMimeData;drag->setMimeData(mimeData);Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction);this->setStyleSheet("background:#000");}
}void OutListItem::mouseMoveEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){qDebug()<<"mouseMoveEvent"<<endl;}
}void OutListItem::mouseReleaseEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){qDebug()<<"mouseReleaseEvent"<<endl;}
}void OutListItem::setLabelTxt(QString str)
{this->ui->label->setText(str);
}
#ifndef OUTLISTITEM_H
#define OUTLISTITEM_H
#include <QDebug>
#include <QWidget>
#include <QMouseEvent>
#include <QDrag>
#include <QMimeData>namespace Ui {
class OutListItem;
}class OutListItem : public QWidget
{Q_OBJECTpublic:explicit OutListItem(QWidget *parent = nullptr);~OutListItem();QString name;void setLabelTxt(QString str);void setName(QString str){name = str;}QString getName(){return name;}protected:void mousePressEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void mouseDoubleClickEvent(QMouseEvent *event);private:Ui::OutListItem *ui;
};#endif // OUTLISTITEM_H
被拖动的对象放下的位置 对象:
#include "screen.h"
#include <QDebug>
#include <QStyleOption>
#include <QPainter>
#include "screenctr.h"Screen::Screen(QWidget *parent) : QWidget(parent)
{this->setCursor(QCursor(Qt::SizeAllCursor));setAcceptDrops(true);
}void Screen::mousePressEvent(QMouseEvent *event){if(event->button()==Qt::LeftButton){}
}void Screen::mouseReleaseEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){}
}void Screen::mouseMoveEvent(QMouseEvent *event)
{}void Screen::paintEvent(QPaintEvent *event)
{//自定义的类需要paintEvent来重新绘制背景Q_UNUSED(event);QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}void Screen::dragEnterEvent(QDragEnterEvent *event)
{qDebug() << "Screen::dragEnterEvent 111 ";event->setDropAction(Qt::MoveAction);event->accept();
}void Screen::dragMoveEvent(QDragMoveEvent *event)
{qDebug() << "Screen::dragMoveEvent 222 ";}void Screen::dropEvent(QDropEvent *event)
{qDebug() << "Screen::dropEvent 333 ";OutListItem* source = qobject_cast<OutListItem*>(event->source());if(source != NULL){qDebug() << "source name ===- " << source->getName();this->scrName = source->getName();QLabel* label = this->findChild<QLabel*>();qDebug() << "label ===- " << label;label->setText(source->getName());}}void Screen::dragLeaveEvent(QDragLeaveEvent *event)
{qDebug() << "Screen::dragLeaveEvent 444 ";
}
#ifndef SCREEN_H
#define SCREEN_H#include <QWidget>
#include "paintergragh.h"
#include <QLineEdit>
#include <QMouseEvent>
#include <QPoint>
#include <QCursor>
#include <QRect>
#include <QtWidgets/QLabel>using namespace neb;
class Screen : public QWidget
{Q_OBJECT
public:explicit Screen(QWidget *parent = nullptr);void paintEvent(QPaintEvent *event);
public:QString scrName;
protected:void mousePressEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void dragEnterEvent(QDragEnterEvent *e);virtual void dragMoveEvent(QDragMoveEvent *e);//允许子类重写覆盖virtual void dropEvent(QDropEvent *e);virtual void dragLeaveEvent(QDragLeaveEvent *e);
};#endif // SCREEN_H
鼠标按住把左侧拖动到右侧:
放下后把名字改掉: