#include "dragimageitem.h" #include #include #include #include #include #include DragImageItem::DragImageItem(QQuickItem *parent) : QQuickPaintedItem(parent) { setWidth(64.0); setHeight(64.0); setZ(10000); setVisible(false); qGuiApp->installEventFilter(this); } QString DragImageItem::imageUrl() const { return m_imageUrl; } void DragImageItem::setImageUrl(QString imageUrl) { if (m_imageUrl == imageUrl || imageUrl.isEmpty()) return; m_imageUrl = imageUrl; if (m_imageUrl.startsWith("qrc:")) m_imageUrl.remove(0, 3); m_image.load(m_imageUrl); m_image = m_image.scaled(width(), height(), Qt::KeepAspectRatio, Qt::SmoothTransformation); emit imageUrlChanged(m_imageUrl); update(); } void DragImageItem::paint(QPainter *p) { p->drawImage(QRectF(0, 0, width(), height()), m_image); } bool DragImageItem::eventFilter(QObject *watched, QEvent *event) { if (event->type() == QEvent::DragMove || event->type() == QEvent::MouseMove || event->type() == QEvent::Move) { setToCursorPos(); } if (event->type() == QEvent::DragEnter) { auto *dragEnterEvent = static_cast(event); setImageUrl(dragEnterEvent->mimeData()->data("imageSource")); setToCursorPos(); setVisible(true); } else if (event->type() == QEvent::DragLeave || event->type() == QEvent::Drop) { setVisible(false); } return QObject::eventFilter(watched, event); } void DragImageItem::setToCursorPos() { QPoint globalCursorPos = QCursor::pos(); QPointF origin(0, 0); auto *p = this->parentItem(); while (p) { origin += QPointF(p->x(), p->y()); p = p->parentItem(); } auto pos = globalCursorPos - QPointF(this->window()->x(), this->window()->y()) - origin; setX(pos.x()); setY(pos.y()); }