拖放QML

时间:2011-10-01 05:05:34

标签: qt qml

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

3 个答案:

答案 0 :(得分:8)

此时,您可能需要使用C ++,特别是如果您想接受来自QML应用程序外部的删除(例如,用户将文件从文件管理器拖到您的应用程序中)。这是一个实现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

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();
}

你的QML:

DropArea {
    onTextDrop: ...
}

您可以类似地实现DragSourceArea。

答案 1 :(得分:3)

我知道它已经有一段时间了,但我为此苦苦挣扎,我想分享Qt5版本:

基于迈克尔的ecloud示例:

DropArea.h:

#ifndef DropArea_H
#define DropArea_H

#include <QQuickItem>

/**
    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 QQuickItem
{
    Q_OBJECT
    Q_PROPERTY(bool acceptingDrops READ isAcceptingDrops WRITE setAcceptingDrops NOTIFY acceptingDropsChanged)

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

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

protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dragLeaveEvent(QDragLeaveEvent *event);
    void dropEvent(QDropEvent *event);

private:
    bool m_accepting;
};

#endif

DropArea.cpp:

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

DropArea::DropArea(QQuickItem *parent)
        : QQuickItem (parent),
    m_accepting(true)
{
    setFlag(QQuickItem::ItemAcceptsDrops, m_accepting);
}

void DropArea::dragEnterEvent(QDragEnterEvent *event)
{
    event->acceptProposedAction();
}

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

void DropArea::dropEvent(QDropEvent *event)
{
    qDebug() << event->mimeData()->text();
    unsetCursor();
}

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

    m_accepting = accepting;
    setFlag(QQuickItem::ItemAcceptsDrops, m_accepting);
    emit acceptingDropsChanged();
}

设为Qml:

Drop2 {
  id: myDropArea    
}

答案 2 :(得分:1)

QML:拖放,调整动态元素大小,这是在一个KDE博客中找到的一个简单示例,该示例完全用QML编写

http://kdeblog.mageprojects.com/2012/08/16/qml-drag-drop-and-resize-dynamic-element-followup/