Может быть лучше использовать пользовательскую графическую сцену с подклассами из QGraphicsScene
, поскольку это значительно упрощает извлечение необходимых координат.Единственная загвоздка в том, что у вас должен быть QGraphicsPixmapItem::pos
доступный в пользовательском классе QGraphicsScene
- я включил полный рабочий пример, который использует Graphics_view_zoom.h
и Graphics_view_zoom.cpp
из связанного вопроса .Позиция QGraphicsPixmapItem
передается члену подкласса QGraphicsScene
, Frame
, для внесения необходимой коррекции.
#include <QPixmap>
#include <QGraphicsPixmapItem>
#include <QGraphicsTextItem>
#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsView>
#include <qfont.h>
#include "Graphics_view_zoom.h"
class Frame : public QGraphicsScene {
Q_OBJECT
public:
QGraphicsTextItem * coords;
QPointF pic_tl;
Frame::Frame(QWidget* parent)
: QGraphicsScene(parent) {
coords = new QGraphicsTextItem();
coords->setZValue(1);
coords->setFlag(QGraphicsItem::ItemIgnoresTransformations, true);
addItem(coords);
}
void Frame::tl(QPointF p) {
pic_tl = p;
}
protected:
void Frame::mouseMoveEvent(QGraphicsSceneMouseEvent* event) {
QPointF pos = event->scenePos();
coords->setPlainText("(" + QString("%1").arg(int(pos.x() - pic_tl.x())) + ", "
+ QString("%1").arg(int(pos.y() - pic_tl.y())) + ")");
coords->setPos(pos);
coords->adjustSize();
}
};
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QMainWindow* main = new QMainWindow();
QGraphicsView* GraphicsView = new QGraphicsView(main);
Graphics_view_zoom* view_wrapper = new Graphics_view_zoom(GraphicsView);
Frame* frame = new Frame(main);
QGraphicsPixmapItem* pixmapItem = new QGraphicsPixmapItem();
frame->addItem(pixmapItem);
GraphicsView->setScene(frame);
// Loads a 497x326 pixel test image
pixmapItem->setPixmap(QPixmap(":/StackOverflow/test"));
// small offset to ensure it works for pictures which are not at
// (0,0). Larger offsets produce the same result but require manual
// adjustments of the view, I have neglected those for brevity as
// they are not in the scope of the question.
pixmapItem->setPos(-20, 20);
frame->tl(pixmapItem->pos());
GraphicsView->fitInView(QRectF(0, 0, 640, 320), Qt::KeepAspectRatio);
GraphicsView->centerOn(pixmapItem->pos());
main->resize(1920, 1080);
main->show();
GraphicsView->resize(main->width(), main->height());
return a.exec();
}
Это отобразит координаты изображения пикселя под мышью относительно (0,0)
в верхнем левом углу.
![image](https://i.stack.imgur.com/XiqKZ.png)
Мышь не видна на этих снимках экрана, но в первом она находится точно в левом верхнем углу, а во втором она находится точно в нижнем правом углу.Если эти координаты необходимы внутри объекта Graphics_view_zoom
, тогда вам просто нужно соответствующим образом охватить экземпляр Frame
или передать значение по мере необходимости.
Примечание - точные отображаемые координаты могут не точно отражать положение мыши в этом примере, поскольку они приведены к int
с для демонстрации, но значения с плавающей запятой могут быть легкодоступ с QGraphicsSceneMoveEvent::scenePos()
возвращает QPointF
.Кроме того, обратите внимание, что при запуске этой демонстрации могут быть некоторые (мы надеемся, очень маленькие) вариации того, где мышь выглядит относительно ее «фактического» положения - я рекомендую использовать Qt::CrossCursor
, чтобы смягчить это.Например, в моей системе курсор по умолчанию отключен примерно на пиксель для определенных областей на моем меньшем дисплее, это также зависит от уровня масштабирования - чем выше масштаб, тем более точные результаты, меньше масштаб будет менее точным.