c++ - QT - 拖放 - 在拖放位置的自定义场景上创建自定义图形对象

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

我创建了简单的 d&d drop - 诸如 QT Creator 菜单之类的东西 - 侧面的 ListView 和 DragScene(我自己的 QGraphicsScene 子类)。我想创建新的图形项目(我已经为它定制了 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 得到的那些参数与那些对象使用的类型完全不同。

目标 1:我想初始化 CustomObjs,使它们出现在我从 List 中删除项目的位置。(但到目前为止 - mevent 的位置始终是 (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";

关于c++ - QT - 拖放 - 在拖放位置的自定义场景上创建自定义图形对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35747063/

相关文章:

jQuery UI - 如何知道拖动的元素是否位于元素 #x 的顶部?

c++ - 如何通过具有命令行参数的 procdump 启动 Windows 应用程序?

c++ - 无法将项目添加到 QMap

cocoa - 将 URL 拖到我的应用程序中

c++ - 在 QString 中查找数字

RubyQt 在 QTableWidget 上崩溃

java - Selenium /Java : can I separate a Drag and Drop action in two actions belonging to two separate classes?

c++ - 使用 WriteFile/ReadFile 进行串行通信

c++ - 如何发送封装在类中的回调函数上的指针

c++ - 何时返回 vector 迭代器而不是 vector ?