我试图在我的场景中生成一个自定义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);
}
这是我逻辑上认为的转换最接近的,但是在实践中它是完全错误的,比简单地从事件中传递位置更加错误(这是位置与主窗口的恒定差异) ?)。任何人都可以纠正我的错误吗?
答案 0 :(得分:1)
在vModule的构造函数中,您在将窗口小部件添加到场景之前调用mapFromScene。
首先添加Widget,然后设置其位置。此外,如果您考虑一下,您将从全局(屏幕)坐标转到本地窗口小部件坐标。假设drop事件坐标位于屏幕空间中,则此函数可能有用: -
QPoint QWidget :: mapFromGlobal(const QPoint& pos)const
Qt帮助定义为: -
将全局屏幕坐标pos转换为窗口小部件坐标。