接受拖放到QGraphicsScene

时间:2019-11-15 20:27:58

标签: c++ qt

尝试将标签从QWidget拖放到QGraphicsScene。我已经从QLabel进行了自定义实现。 QGraphicsView也接受放置。问题在于,将元素拖放到QGraphicsScene时没有任何事件。

QLabel实现.cpp

void ItemLabel::mousePressEvent(QMouseEvent *ev)
{
    if(ev->button() == Qt::LeftButton){
       QDrag *drag = new QDrag(this);
       QMimeData *mimeData = new QMimeData;

       mimeData->setText("Test");
       drag->setMimeData(mimeData);
       drag->setPixmap(*this->pixmap());
       drag->exec();

       Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction);
    }
}

场景.cpp

void Scene::dropEvent(QGraphicsSceneDragDropEvent  *event)
{
    event->acceptProposedAction();
    qDebug() << "drop";
}

void Scene::dragEnterEvent(QGraphicsSceneDragDropEvent  *event)
{
    if(event->mimeData()->hasFormat("text/plain"))
        event->acceptProposedAction();
}

我需要做些什么才能获得场景接收滴?

1 个答案:

答案 0 :(得分:0)

您应该扩展QGraphicsView,设置QGraphicsScene,然后覆盖QGraphicsView拖放槽。

看看这个工作示例:

MyGraphicsView::MyGraphicsView(QObject *p_parent):
    QGraphicsView(),
    m_scene(nullptr)
{ 

    ...
    m_scene = new QGraphicsScene(rect(), p_parent);
    setScene(m_scene);
    setAcceptDrops(true);
}


void MyGraphicsView::dragEnterEvent(QDragEnterEvent *p_event)
{
    p_event->acceptProposedAction();
}

void MyGraphicsView::dragMoveEvent(QDragMoveEvent *p_event)
{
    p_event->acceptProposedAction();
}

void MyGraphicsView::dropEvent(QDropEvent *p_event)
{
    p_event->acceptProposedAction();
}

如果您没有在acceptProposedAction()dragEnterdragMove,将永远不会触发dropEvent