2

QGraphicsView クラスから再実装された View クラスがあります。

マウスを右ボタンでクリックしたときに線を引こうとしています。

これが私の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 の問題は何ですか?

4

1 に答える 1

3

グラフィックビューのビューポートに問題があると思います。QGraphicsViewビューポートにシーンをレンダリングします。これは QWidget でもあります (OpenGL ビューポートなどの可能性があります)。したがって、このビューポートはすべてのイベントをキャッチして処理します。

ビューではなく、シーンでのマウス プレス イベントを監視することをお勧めします。ビューにはシーンの一部のみが表示されます。適切に線を作成するには、ビューの座標をシーンの座標に変換する必要があります。

また、シーン/ビューのサブクラス化を避けたいのですが、代わりに、シーンにイベント フィルターとして登録されるマネージャー オブジェクトを .xml で作成しますQObject::installEventFilter。このようにして、さまざまなマネージャーをさまざまなシーンにプラグインでき、継承に煩わされることはありません。

于 2011-02-11T01:51:03.040 に答える