0

我试图在我的场景中生成一个自定义 QGraphicsItem,但不确定如何将点从其原点准确映射到项目。我的位置来自 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);
}

这与我在逻辑上认为的转换最接近,但在实践中这是非常错误的,比简单地从事件中按原样传递位置更错误(这是与主窗口位置的恒定差异?)。谁能纠正我的错误?

4

1 回答 1

1

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

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

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

Qt帮助定义为: -

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

于 2013-05-16T16:01:28.430 回答