0

私はQGraphicsViewをサブクラス化しており、マウスの移動中にMidButtonを押すと、通常のQGraphicsViewのアクションを使用しているかのように動作しますが、左ボタンを押すと画像がスライドします。 。

コーディングしてみましたが、うまくいかないようで、理由がわかりません。

void MyQGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() == Qt::MidButton)
    {
        QMouseEvent event2(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::LeftButton, Qt::NoModifier);
        QGraphicsView::mouseMoveEvent(&event2);
    }
}

どんな助けでもいただければ幸いです。

編集:Anthonyが指摘した明らかなエラーを削除しました。

4

2 に答える 2

2

いくつかの問題があります。まず、テスト条件はtestFlagsではなくを使用する必要があります==。次に、でイベントを作成していましたがQt::MidButton、それは である必要がありますQt::LeftButtonmousePressEvent最後に、 (QGraphicsView が手のドラッグを開始することを知ることができるように)に対しても同様のテストを行う必要があります。

void mousePressEvent(QMouseEvent *event)
{
    if (event->buttons().testFlag(Qt::MidButton))
    {
        QMouseEvent event2(QEvent::MouseButtonPress, event->pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);

        // do default behavior as if you pressed the left button
        QGraphicsView::mousePressEvent(&event2);
    }
    else
    {
        QGraphicsView::mousePressEvent(event);
    }
}
void mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons().testFlag(Qt::MidButton))
    {
        QMouseEvent event2(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::LeftButton, Qt::NoModifier);

        // do default behavior as if you pressed the left button
        QGraphicsView::mouseMoveEvent(&event2);
    }
    else
    {
        QGraphicsView::mouseMoveEvent(event);
    }
}
于 2012-06-21T19:41:53.053 に答える
0

あなたが目指しているように見えるのは、「ハンドドラッグ」モードのトリガーボタンを左ボタンから中央ボタンに変更することです。

イベント変更メソッドは機能しますが、いくつかの問題があります。QGraphicsView「ハンド ドラッグ」モードの場合、後でドラッグしない左クリックがシーン/アイテムに伝播します。つまり、中クリックしてドラッグせずに離すと、ドラッグせずに左クリックして離したと見なされます。シーン上で左クリックを効果的にトリガーすることができます。

代わりに、中クリックの動作をオーバーライドして、シーンを直接スクロールすることができます。このコードは から取得されましたQGraphicsView::mouseMoveEvent():

void View::mousePressEvent(QMouseEvent *event)
{
    _lastPos = event->pos();
    QGraphicsView::mousePressEvent(event);
}

void View::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons().testFlag(Qt::MidButton))
    {
        QScrollBar *hBar = horizontalScrollBar();
        QScrollBar *vBar = verticalScrollBar();
        QPoint delta = event->pos() - _lastPos;
        _lastPos = event->pos();
        hBar->setValue(hBar->value() + (isRightToLeft() ? delta.x() : -delta.x()));
        vBar->setValue(vBar->value() - delta.y());
    }
    QGraphicsView::mouseMoveEvent(event);
}
于 2013-04-03T11:17:13.527 に答える