#include "TestMouseWidget.h"
#include "ui_TestMouseWidget.h"
#include <QtWidgets>
#include <QMouseEvent>
#include <QPushButton>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QDrag>
#include <QDebug>
#include "TestButton.h"
TestMouseWidget::TestMouseWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::TestMouseWidget)
{
ui->setupUi(this);
setAcceptDrops(true);
m_hash.clear();
}
TestMouseWidget::~TestMouseWidget()
{
delete ui;
}
/**
*@brief 用户放开了鼠标完成drop操作。一般来说,应该解析出该drag所携带的data,
* 然后做一个插入操作。调用acceptProposedAction()来通知源窗口,说此操作已经被接受,
* 源窗口应于此时做一个删除/复制操作。
*/
void TestMouseWidget::dropEvent(QDropEvent *e)
{
//qDebug()<<"target dropEvent :"<<e->mimeData()->text();
e->acceptProposedAction();
TestButton *pBtn = nullptr;
if(m_hash.contains(e->mimeData()->text()))
{
pBtn = m_hash.value(e->mimeData()->text());
QPoint hotSpot;
QByteArrayList hotSpotPos = e->mimeData()->data(QStringLiteral("application/x-hotspot")).split(' ');
if (hotSpotPos.size() == 2) {
hotSpot.setX(hotSpotPos.first().toInt());
hotSpot.setY(hotSpotPos.last().toInt());
}
pBtn->move(e->pos()-hotSpot);
}
else
{
pBtn = new TestButton(this);
pBtn->setText(e->mimeData()->text());
pBtn->resize(80,20);
m_hash.insert(pBtn->text(),pBtn);
pBtn->move(e->pos());
}
pBtn->show();
}
/**
*@brief 表示拖动操作进入本窗口,如果该event被ignore,
* 则鼠标在窗口中会显示一个forbidden状态的圆圈,表示禁止拖进来
*/
void TestMouseWidget::dragEnterEvent(QDragEnterEvent *e)
{
qDebug()<<"target dragEnterEvent :"<<e->mimeData()->text();
e->acceptProposedAction();
}
/**
*@brief 用户拖动东西在目标窗口内游荡,在拖到某此点位时,应提示允许其drop放下。
* 比如目标窗口里有若干个坑,那么当鼠标over到坑上时,就应该提示这里可以drop并改
* 变鼠标形状。
*/
void TestMouseWidget::dragMoveEvent(QDragMoveEvent *e)
{
//qDebug()<<"target dragMoveEvent :"<<e->mimeData()->text();
e->acceptProposedAction();
}