Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何从主窗口映射到QGraphicsItem?_Qt_Qgraphicsitem - Fatal编程技术网

Qt 如何从主窗口映射到QGraphicsItem?

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-

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

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

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

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

QPoint QWidget::mapFromGlobal(常量QPoint和pos)常量

Qt帮助将其定义为:-

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


DropEvents是否在全局坐标中创建?我不知道这件事。这是否取决于拖动事件的创建位置?此外,从全局坐标进行映射,保持vModule中的映射不变,也不起作用。如果调整窗口的大小,放置位置就会偏离,这使我相信vModule中的映射是错误的。我在问题的注释中发布的解决方案是有效的,但必须有更好的方法来实现这一点……如果您不使用mapFromGlobal,请将问题分解为更小的步骤。不使用放置坐标,只需创建一个对象,将其添加到场景中,然后设置其场景位置。因此,使用放置坐标,您需要获取视图(放置)坐标,将它们映射到场景坐标,然后使用该坐标设置小部件的位置。此外,在小部件构造函数中,使用setPos将更有效,因为setX()调用y(),setY()调用x()。当setPos设置相对于父对象的坐标或场景坐标(如果不存在父对象)时,不需要在小部件构造函数中调用mapFromScene。。。三次。从放置坐标开始,我按照以下方式进行映射:放置位置->绘图区域(mapFromParent)->绘图区域(mapToScene)->graphicsItem(mapFromScene)。所有这些映射都在主窗口中完成。但必须有更好的方法来做到这一点。。。