Qt 如何从主窗口映射到QGraphicsItem?
我正试图在场景中生成一个自定义QGraphicsItem,但不确定如何准确地将点从原点映射到项目。我的位置来自我的主窗口中的dropEvent:Qt 如何从主窗口映射到QGraphicsItem?,qt,qgraphicsitem,Qt,Qgraphicsitem,我正试图在场景中生成一个自定义QGraphicsItem,但不确定如何准确地将点从原点映射到项目。我的位置来自我的主窗口中的dropEvent: void MainWindow::dropEvent(QDropEvent *event) { QPointF dropPos = ui->GraphicsView->mapFrom(this, event->pos()); vModule *module = new vModule(dropPos); ui-
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);
}
这与我在逻辑上认为的转换最接近,但在实践中它是非常错误的,比简单地按原样传递事件的位置更错误(这是与主窗口位置的恒定差异?)。有人能纠正我的错误吗?在vModule的构造函数中,在小部件添加到场景之前,您正在调用mapFromScene 首先添加小部件,然后设置其位置。另外,如果您仔细考虑,您将从全局(屏幕)坐标转换为本地小部件坐标。假设放置事件坐标在屏幕空间中,此函数可能有用:- QPoint QWidget::mapFromGlobal(常量QPoint和pos)常量 Qt帮助将其定义为:- 将全局屏幕坐标pos转换为小部件坐标
DropEvents是否在全局坐标中创建?我不知道这件事。这是否取决于拖动事件的创建位置?此外,从全局坐标进行映射,保持vModule中的映射不变,也不起作用。如果调整窗口的大小,放置位置就会偏离,这使我相信vModule中的映射是错误的。我在问题的注释中发布的解决方案是有效的,但必须有更好的方法来实现这一点……如果您不使用mapFromGlobal,请将问题分解为更小的步骤。不使用放置坐标,只需创建一个对象,将其添加到场景中,然后设置其场景位置。因此,使用放置坐标,您需要获取视图(放置)坐标,将它们映射到场景坐标,然后使用该坐标设置小部件的位置。此外,在小部件构造函数中,使用setPos将更有效,因为setX()调用y(),setY()调用x()。当setPos设置相对于父对象的坐标或场景坐标(如果不存在父对象)时,不需要在小部件构造函数中调用mapFromScene。。。三次。从放置坐标开始,我按照以下方式进行映射:放置位置->绘图区域(mapFromParent)->绘图区域(mapToScene)->graphicsItem(mapFromScene)。所有这些映射都在主窗口中完成。但必须有更好的方法来做到这一点。。。