如何从MainWindow映射到QGraphicsItem?

时间:2013-05-16 15:43:16

标签: qt qgraphicsitem

我试图在我的场景中生成一个自定义QGraphicsItem,但我不确定如何将点从其原点映射到Item。我的位置来自我的MainWindow中的dropEvent:

void MainWindow::dropEvent(QDropEvent *event)
{
    QPointF dropPos = ui->GraphicsView->mapFrom(this, event->pos());
    vModule *module = new vModule(dropPos);
    ui->GraphicsView->scene->addItem(module);
}

这是我的vModule.cpp:

vModule::vModule(QPointF dropPos)
{
    QPointF pos = mapFromScene(dropPos);
    setX(pos.x());
    setY(pos.y());
    // ...
}

// Event handler implementation, shouldn't be relevant

我的vModule.h:

class vModule : public QObject, public QGraphicsItem
{
public:
    explicit vModule(QPointF dropPos);
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    QRectF boundingRect() const;

protected:
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
}

这是我逻辑上认为的转换最接近的,但是在实践中它是完全错误的,比简单地从事件中传递位置更加错误(这是位置与主窗口的恒定差异) ?)。任何人都可以纠正我的错误吗?

1 个答案:

答案 0 :(得分:1)

在vModule的构造函数中,您在将窗口小部件添加到场景之前调用mapFromScene。

首先添加Widget,然后设置其位置。此外,如果您考虑一下,您将从全局(屏幕)坐标转到本地窗口小部件坐标。假设drop事件坐标位于屏幕空间中,则此函数可能有用: -

  

QPoint QWidget :: mapFromGlobal(const QPoint& pos)const

Qt帮助定义为: -

  

将全局屏幕坐标pos转换为窗口小部件坐标。