Я создал простой д&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
Использовать 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";
Других решений пока нет …