Показать координаты X и Y в QGraphicsView - PullRequest
1 голос
/ 25 июня 2019

Я хочу отобразить изображение в QGraphicsView, на самом деле в QGraphicsScene, это самая простая часть, но когда я перемещаю курсор над изображением, я хочу видеть координаты X и Y (желтые линии),как на этом изображении, может кто-нибудь объяснить мне, как это сделать?

enter image description here

1 Ответ

3 голосов
/ 25 июня 2019

Для реализации того, что вы хотите, есть 2 задачи:

  • Получить положение курсора, для этого случая флаг mouseTracking включен так, чтоmouseMoveEvent() вызывается там, где получена позиция.

  • Краска на верхнем слое, для этого мы используем функцию drawForeground().

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

...