QT - 拖放 - 在Drop的自定义场景中创建自定义图形对象

时间:2016-03-02 12:19:12

标签: c++ qt drag-and-drop scene

我创建了简单的d& d drop-soemthing,如QT Creator菜单 - 侧面的ListView和DragScene(我自己的QGraphicsScene的子类)。我想创建新的Graphic项目(我已经有我的custo mclasses)添加到那里 - 我放弃了它(类似于QT Designer的工作方式)。我创建了自己的课程:

DragScene.h

#include <QGraphicsScene>
#include <QDebug>
#include <QMimeData>

#include "CustomObj.h"

class DragScene : public QGraphicsScene
{
public:
    DragScene(QObject* parent = 0);

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

DragScene.cpp

#include "DragScene.h"

DragScene::DragScene(QObject* parent)
    : QGraphicsScene(parent)
{
}

void DragScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
}

void DragScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
{
}

void DragScene::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
{
}

void DragScene::dropEvent(QGraphicsSceneDragDropEvent *event)
{
        CustomObj* newObject = new CustomObj(0,0,50,50);
        newObject->setPos(event->pos().x(), event->pos().y()); //(1)
        this->addItem(newObject);

        qDebug() <<"New object";
}

现在,当我拖动我的项目时 - 它出现了,但总是@ point(0,0)。我不知道为什么会这样。更奇怪的是 - 我补充道:

qDebug() << "Moving : "<< event->pos();

in

void CustomObj::mouseMoveEvent(QGraphicsSceneMouseEvent *event);

我看到它是如何移动它的时候:

  

搬家:QPointF(17,29)

     

搬家:QPointF(17,29)

     

搬家:QPointF(18,29)

     

搬家:QPointF(18,30)

     

搬家:QPointF(17,30)

     

搬家:QPointF(18,29)

     

搬家:QPointF(17,30)

     

搬家:QPointF(17,30)

     

搬家:QPointF(18,31)

     

搬家:QPointF(17,30)

     

...

它是在创建它之后的第一步 - 它就像我得到的那些参数@start是完全不同的类型然后那些对象使用。

目标1 我想初始化CustomObjs,使它们出现在我从List中删除项目的位置。(但到目前为止 - mevent的位置总是(0, 0)并且在鼠标引起的这个对象的第一次移动时 - 我可以从qDebug()看到该位置不是(0,0),但是每个元素仍然出现在同一个地方。) 目标2 我想控制它们留在场景中(无法通过其边界)

1 个答案:

答案 0 :(得分:1)

目标1

使用QGraphicsSceneDragDropEvent::​scenePos()在场景坐标中获得正确的位置。

目标2

CustomObj* newObject = new CustomObj(0,0,50,50);
newObject->setPos(event->scenePos());

QRectF sceneArea = scene->sceneRect(); // QGraphicsScene::sceneRect()
QRectF itemArea = newObject->sceneBoundingRect();

// Test if your item bounding rectangle completely lies inside the scene rectangle.
if (sceneArea.contains(itemArea))
    scene->addItem(newObject);
else
    qDebug() << "Outside the scene";