Если я правильно понимаю, вы хотите нарисовать горизонтальную линию и вертикальную линию, пересекающую позицию курсора и имеющую размер окна просмотра.
Возможным решением будет переопределение QGraphicsScene :: drawForeground () чтобы нарисовать две линии с рисовальщиком.
Проблема в том, что сцена не знает о положении мыши.Это означает, что представление должно будет отслеживать его и информировать сцену об изменении положения мыши.
Для этого вам нужно будет создать свой собственный GraphicsScene
(наследующий QGraphicsScene
) и свой собственный.GraphicsView
(наследует QGraphicsView
).
В конструкторе GraphicsView
вам нужно будет начать отслеживание мыши.Это заставит вас получать mouseMoveEvent
каждый раз, когда мышь перемещается внутри вида:
GraphicsViewTrack::GraphicsViewTrack(QWidget* parent) : QGraphicsView(parent) {
setMouseTracking(true);
}
void GraphicsViewTrack::mouseMoveEvent(QMouseEvent* pEvent) {
QPointF MousePos = this->mapToScene(pEvent->pos());
emit mousePosChanged(MousePos.toPoint());
}
Как видно из приведенного выше фрагмента кода, вид излучает сигнал (mousePosChanged
) дляс которой сцена будет связана.Этот сигнал содержит положение мыши, преобразованное в координаты сцены.
Теперь на стороне сцены необходимо добавить слот, который будет вызываться при изменении положения мыши, сохранить новую позицию мыши в элементе.переменная и переопределение QGraphicsScene :: drawForeground () :
void GraphicsSceneCross::drawForeground(QPainter* painter, const QRectF& rect) {
QRectF SceneRect = this->sceneRect();
painter->setPen(QPen(Qt::black, 1));
painter->drawLine(SceneRect.left(), m_MousePos.y(), SceneRect.right(), m_MousePos.y());
painter->drawLine(m_MousePos.x(), SceneRect.top(), m_MousePos.x(), SceneRect.bottom());
}
void GraphicsSceneCross::onMouseChanged(QPoint NewMousePos) {
m_MousePos = NewMousePos; // Store the mouse position in a member variable
invalidate(); // Tells the scene it should be redrawn
}
Последнее, что нужно сделать, это подключить сигнал GraphicsView к слоту GraphicsScene.
Я позволюВы проверяете, является ли это решение приемлемым с точки зрения производительности.