C++ Qgraphicscene图像位置pixmap

C++ Qgraphicscene图像位置pixmap,c++,qt,C++,Qt,我正在使用Qt图形框架显示图像。我使用addPixmap()在QGraphicsView的子类qgraphicscene中打开了一个原始图像。我使用缩放功能添加了缩放功能,拖动模式设置为滚动手动拖动。现在,我需要在鼠标悬停时获取场景中的像素坐标,以便x和y值显示鼠标当前指向的图像(由pixmap绘制)中的像素。我试着使用pos(),但没用 以下是来自Widget.cpp的代码: img = openImage(dirPath2.toLocal8Bit().data(),

我正在使用Qt图形框架显示图像。我使用
addPixmap()
QGraphicsView
的子类
qgraphicscene
中打开了一个原始图像。我使用缩放功能添加了缩放功能,拖动模式设置为滚动手动拖动。现在,我需要在鼠标悬停时获取场景中的像素坐标,以便x和y值显示鼠标当前指向的图像(由pixmap绘制)中的像素。我试着使用
pos()
,但没用

以下是来自
Widget.cpp
的代码:

img = openImage(dirPath2.toLocal8Bit().data(),
                sizeX,sizeY,file_heade,scan_heade,bpp,sign);
QPixmap x = QPixmap(sizeX,sizeY);
x.convertFromImage(img,Qt::AutoColor);
scene->addPixmap(x);
ui->disp_img->setDragMode(QGraphicsView::ScrollHandDrag);
graphicscene.h

class GraphicsScene : public QGraphicsScene {
public:
    GraphicsScene(QWidget *parent) : QGraphicsScene(parent){}
};

(最好是pixmap坐标,但即使这样也不会发生,如果缩放时值发生变化,我将使用比例因子来获取原始值)

我建议您从阅读有关的内容开始

坐标系有不同的层次,您需要考虑与之打交道的层次。在顶层是屏幕(或视图),这是鼠标坐标所在的位置

视图的下一层是图形场景。图形项(如您使用addPixmap添加的QGraphicsPixmapItem)驻留在此处。图形场景可以可视化为项目的世界,每个项目都有自己的位置和方向

移动到最后一个坐标系是项目的局部坐标系。例如,如果我们取一个矩形,它的(x,y,w,h)的局部坐标可能是(-5,-5,10,10)。然后将该项目放置在场景中的某个位置。如果其位置是场景的原点(0,0),则该项目的局部坐标将读取与其场景坐标相同的值

但是,如果在x轴上移动矩形+5个单位,其局部坐标相同,但其场景坐标现在将为(0,-5,10,10)

同样,视图(QGraphicscene)是一个进入场景的窗口,可以查看整个场景,也可以只查看其中的一部分。由于视图的左上角坐标为(0,0),它可能映射到场景的(0,0)上,也可能不映射到(0,0),具体取决于视图所查看的场景区域

因此,通过获取鼠标位置,您将从视图的坐标开始,并需要转换为场景的坐标系。幸运的是,Qt在每个级别都为此提供了很多有用的函数

要将鼠标坐标从视图转换到场景,可以使用视图的功能

然后,使用场景坐标可以获取一个项目,并将其映射到项目的局部坐标和项目的位置