QT - 拖放 - 在拖放位置的自定义场景上创建自定义图形对象
QT - Drag and Drop - Creating Custom Graphic object on Custom Scene in Drop's place
我创建了简单的 d&d drop - 诸如 QT Creator 菜单之类的东西 - 侧面的 ListView 和 DragScene(我自己的 QGraphicsScene 的子class)。我想创建新的图形项目(我已经为它定制了 mclasses)以将其添加到那里 - 在我放下它的地方(类似于 QT Designer 的工作方式)。我创建了自己的 class:
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";
}
现在,当我拖动我的项目时 - 它会出现,但总是@点 (0,0)。我不知道这是为什么。更奇怪的是 - 我补充说:
qDebug() << "Moving : "<< event->pos();
在
void CustomObj::mouseMoveEvent(QGraphicsSceneMouseEvent *event);
我在移动它时看到它摇摇欲坠:
Moving : QPointF(17, 29)
Moving : QPointF(17, 29)
Moving : QPointF(18, 29)
Moving : QPointF(18, 30)
Moving : QPointF(17, 30)
Moving : QPointF(18, 29)
Moving : QPointF(17, 30)
Moving : QPointF(17, 30)
Moving : QPointF(18, 31)
Moving : QPointF(17, 30)
...
这是在创建它之后的第一步 - 就像我在@start 得到的那些参数与那些对象使用的类型完全不同。
Objective 1 : 我想初始化 CustomObjs 以使它们出现在我从列表中删除项目的位置。 (但到目前为止 - mevent 的位置始终是 (0,0) 并且在由鼠标引起的该对象的第一次移动时 - 我可以从 qDebug() 中看到位置不是 (0,0),但每个元素仍然出现在一样的地方。)
Objective 2 : 我想控制他们留在场景中(无法通过它的边界)
Objective 1
使用QGraphicsSceneDragDropEvent::scenePos()
获取场景坐标中的正确位置。
Objective 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";
我创建了简单的 d&d drop - 诸如 QT Creator 菜单之类的东西 - 侧面的 ListView 和 DragScene(我自己的 QGraphicsScene 的子class)。我想创建新的图形项目(我已经为它定制了 mclasses)以将其添加到那里 - 在我放下它的地方(类似于 QT Designer 的工作方式)。我创建了自己的 class:
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";
}
现在,当我拖动我的项目时 - 它会出现,但总是@点 (0,0)。我不知道这是为什么。更奇怪的是 - 我补充说:
qDebug() << "Moving : "<< event->pos();
在
void CustomObj::mouseMoveEvent(QGraphicsSceneMouseEvent *event);
我在移动它时看到它摇摇欲坠:
Moving : QPointF(17, 29)
Moving : QPointF(17, 29)
Moving : QPointF(18, 29)
Moving : QPointF(18, 30)
Moving : QPointF(17, 30)
Moving : QPointF(18, 29)
Moving : QPointF(17, 30)
Moving : QPointF(17, 30)
Moving : QPointF(18, 31)
Moving : QPointF(17, 30)
...
这是在创建它之后的第一步 - 就像我在@start 得到的那些参数与那些对象使用的类型完全不同。
Objective 1 : 我想初始化 CustomObjs 以使它们出现在我从列表中删除项目的位置。 (但到目前为止 - mevent 的位置始终是 (0,0) 并且在由鼠标引起的该对象的第一次移动时 - 我可以从 qDebug() 中看到位置不是 (0,0),但每个元素仍然出现在一样的地方。) Objective 2 : 我想控制他们留在场景中(无法通过它的边界)
Objective 1
使用QGraphicsSceneDragDropEvent::scenePos()
获取场景坐标中的正确位置。
Objective 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";