QT — Drag and Drop — Создание пользовательского графического объекта на пользовательской сцене вместо Drop

Я создал простой д&d drop — что-то вроде меню QT Creator — ListView сбоку и DragScene (мой собственный подкласс QGraphicsScene). Я хочу создать новый элемент Graphic (я уже получил для него свои обычные классы), чтобы добавить его туда, где я его бросил (что-то похожее на работу 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";
}

Теперь, когда я перетаскиваю свою Itemy — она ​​появляется, но всегда @ point (0,0). Я не знаю, почему это так. Что еще страннее — я добавил:

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

в

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, чтобы они отображались там, где я удалил свой элемент из списка. (Но пока — положение для события всегда (0,0) и при первом перемещении этого объекта, вызванном мышью — из qDebug () я могу видеть, что положение не было (0,0), но все же каждый элемент появляется в такое же место.)
Цель 2 : Я хочу контролировать их, чтобы оставаться на сцене (быть не в состоянии пройти через ее границы)

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";
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]