QGraphicsView - проблема с событием нажатия правой кнопки мыши

У меня есть класс View, который переопределен из класса QGraphicsView.

Я пытаюсь нарисовать линию при щелчке правой кнопкой мыши.

Вот мои коды mousePressEvent, mouseReleaseEvent и mouseMoveEvent:


View::View(QWidget *parent) :  QGraphicsView(parent)
{
    setAcceptDrops(true);
    setDragMode(QGraphicsView::RubberBandDrag);
    posFirst = QPoint(0,0);
    setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
    pressed = false;
    area = new Area;
    setScene(area);
    selectionLine = new QGraphicsLineItem(0,0,0,0,0,area);
    selectionLine->setPen(QPen(Qt::DashLine));
}

void View::mousePressEvent(QMouseEvent *event){ if(event->button() == Qt::RightButton ){ posFirst.setX( event->pos().x() ); posFirst.setY( event->pos().y() ); pressed = true; selectionLine->setVisible(true); } QGraphicsView::mousePressEvent(event); }

void View::mouseReleaseEvent(QMouseEvent *event){ update(); pressed = false; selectionLine->setVisible(false); event->accept(); selectionLine->setLine(0,0,0,0); QGraphicsView::mouseReleaseEvent(event); }

void View::mouseMoveEvent(QMouseEvent *event){ if(pressed ){ selectionLine->setLine(posFirst.x() , posFirst.y() , event->pos().x() , event->pos().y() ); } QGraphicsView::mouseMoveEvent(event); }

Но этот код не работает должным образом. Он не улавливает события релаксации мыши и события перемещения мыши должным образом. Если я установил if (event-> button () == Qt :: LeftButton), он будет работать, как ожидалось.

Также я пробовал с Qt :: MidButton, и это сработало.

В чем проблема с RightButton?


person Baris Atamer    schedule 09.02.2011    source источник


Ответы (1)


Я думаю, что проблема в области просмотра графического представления. QGraphicsView отображает сцену в области просмотра, которая также является QWidget (это может быть область просмотра OpenGL или что-то еще). Таким образом, это окно просмотра улавливает и обрабатывает все события.

Лучше следить за событиями нажатия мыши на сцене, а не на виде. Вид отображает только зелье сцены, вам нужно будет перевести координаты вида в координаты сцены, чтобы правильно создать линию.

Мне также нравится избегать создания подклассов сцены / представления, вместо этого я создаю объект-менеджер, который регистрируется как фильтр событий на сцене с помощью QObject::installEventFilter. Таким образом, вы можете подключать разных менеджеров к разным сценам и не беспокоиться о наследовании.

person ak.    schedule 11.02.2011