QGraphicsScene图像pos pixmap

时间:2014-05-01 19:02:30

标签: c++ qt

我正在使用Qt Graphics Framework来显示图像。我使用QGraphicsSceneQGraphicsView中的子addPixmap()中打开了原始图像。我通过使用缩放功能添加了缩放功能,拖动模式设置为滚动手拖动。现在,我需要在鼠标悬停时获取场景中的像素坐标,使得x和y值显示鼠标当前指向的图像中的像素(由像素图绘制)。我尝试使用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);

GraphicsScene.h

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

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

1 个答案:

答案 0 :(得分:0)

我建议您先阅读Qt's Graphics Coordinate System

有各种各样的坐标系层,你需要考虑与你交往的那些层。顶层是屏幕(或视图),它是鼠标坐标所在的位置。

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

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

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

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

因此,通过获取鼠标位置,您可以从视图的坐标开始,并需要转换为场景的坐标系。幸运的是,Qt为每个级别提供了许多有用的功能。

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

使用场景坐标,您可以获得一个项目,并使用项目mapFromScene将其映射到项目的本地坐标。