拖放QML

Alt*_*taf 3 qt qml

如何在QML中开发拖放功能?我想将一个图像拖放到另一个图像.

小智 8

此时,您可能需要使用C++,特别是如果您想接受来自QML应用程序外部的drop(例如,用户将文件从文件管理器拖到您的应用程序中).这是一个实现DropArea项的示例组件类:

DropArea.h:

#ifndef DropArea_H
#define DropArea_H

#include <QDeclarativeItem>

/**
    An oversimplified prototype Item which accepts any drop that includes
    data with mime type of text/plain, and just emits the text.
*/
class DropArea : public QDeclarativeItem
{
    Q_OBJECT
    Q_PROPERTY(bool acceptingDrops READ isAcceptingDrops WRITE setAcceptingDrops NOTIFY acceptingDropsChanged)

public:
    DropArea(QDeclarativeItem *parent=0);
    bool isAcceptingDrops() const { return m_accepting; }
    void setAcceptingDrops(bool accepting);

signals:
    void textDrop(QString text);
    void acceptingDropsChanged();

protected:
    void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
    void dragLeaveEvent(QGraphicsSceneDragDropEvent *event);
    void dropEvent(QGraphicsSceneDragDropEvent *event);

private:
    bool m_accepting;
};

#endif
Run Code Online (Sandbox Code Playgroud)

DropArea.cpp:

#include <QGraphicsSceneDragDropEvent>
#include <QMimeData>
#include "DropArea.h"

DropArea::DropArea(QDeclarativeItem *parent)
        : QDeclarativeItem(parent),
    m_accepting(true)
{
    setAcceptDrops(m_accepting);
}

void DropArea::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
    event->acceptProposedAction();
    setCursor(Qt::DragMoveCursor);
}

void DropArea::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
{
    unsetCursor();
}

void DropArea::dropEvent(QGraphicsSceneDragDropEvent *event)
{
    emit textDrop(event->mimeData()->text());
    unsetCursor();
}

void DropArea::setAcceptingDrops(bool accepting)
{
    if (accepting == m_accepting)
                return;

    m_accepting = accepting;
    setAcceptDrops(m_accepting);
    emit acceptingDropsChanged();
}
Run Code Online (Sandbox Code Playgroud)

你的QML:

DropArea {
    onTextDrop: ...
}
Run Code Online (Sandbox Code Playgroud)

您可以类似地实现DragSourceArea.