Если я правильно понимаю, вы хотите нарисовать горизонтальную линию и вертикальную линию, пересекающуюся в позиции курсора и имеющую такой же размер, как окно просмотра.
Возможным решением было бы переопределить 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.
Я позволю вам проверить, приемлемо ли это решение с точки зрения производительности.
person
Jérôme
schedule
17.01.2011