QT 实现鼠标拖动(drag)和放下(drop)代码(图形操作四)

 拖动的对象:

#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_OBJECT

public:
    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

 鼠标按住把左侧拖动到右侧:

 放下后把名字改掉:

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值