QGraphicsView Проблема события нажатия правой кнопки мыши - PullRequest
2 голосов
/ 10 февраля 2011

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

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

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

<code>
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));
}</p>

<p>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);
}</p>

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

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

<p>

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

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

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

1 Ответ

3 голосов
/ 11 февраля 2011

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

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

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

...