我正在使用Qt Graphics Framework来显示图像。我使用QGraphicsScene
在QGraphicsView
中的子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坐标,但即使没有发生,如果在缩放时值会发生变化,我会使用比例因子来获取原始值)
答案 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将其映射到项目的本地坐标。