1

I want to display an image in a QGraphicsView, actually in QGraphicsScene, this is the easy part, bu, when I move the cursor over the image, I want to see the X and Y coordinates lines (the yellow lines), like in this image, can anyone explain me how to do this?

enter image description here

eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Vesa95
  • 607
  • 1
  • 7
  • 26

1 Answers1

4

To implement what you want there are 2 tasks:

from PyQt5 import QtCore, QtGui, QtWidgets


class GraphicsScene(QtWidgets.QGraphicsScene):
    def drawForeground(self, painter, rect):
        super(GraphicsScene, self).drawForeground(painter, rect)
        if not hasattr(self, "cursor_position"):
            return
        painter.save()
        pen = QtGui.QPen(QtGui.QColor("yellow"))
        pen.setWidth(4)
        painter.setPen(pen)
        linex = QtCore.QLineF(
            rect.left(),
            self.cursor_position.y(),
            rect.right(),
            self.cursor_position.y(),
        )
        liney = QtCore.QLineF(
            self.cursor_position.x(),
            rect.top(),
            self.cursor_position.x(),
            rect.bottom(),
        )
        for line in (linex, liney):
            painter.drawLine(line)
        painter.restore()

    def mouseMoveEvent(self, event):
        self.cursor_position = event.scenePos()
        self.update()
        super(GraphicsScene, self).mouseMoveEvent(event)


class GraphicsView(QtWidgets.QGraphicsView):
    def __init__(self, parent=None):
        super(GraphicsView, self).__init__(parent)
        self.setMouseTracking(True)
        scene = GraphicsScene(QtCore.QRectF(-200, -200, 400, 400), self)
        self.setScene(scene)


if __name__ == "__main__":
    import sys
    import random

    app = QtWidgets.QApplication(sys.argv)

    w = GraphicsView()

    for _ in range(4):
        r = QtCore.QRectF(
            *random.sample(range(-200, 200), 2),
            *random.sample(range(50, 150), 2)
        )
        it = w.scene().addRect(r)
        it.setBrush(QtGui.QColor(*random.sample(range(255), 3)))

    w.resize(640, 480)
    w.show()

    sys.exit(app.exec_())

enter image description here

enter image description here

eyllanesc
  • 235,170
  • 19
  • 170
  • 241