23

現在、画像をグラフィックスシーンにロードしてから、QGraphicsViewer に再度ロードできます。

QEvent::Wheel を検出してから、graphicsViews の scale() 関数を呼び出すことで、ズーム機能を実装できます。

ただし、パン機能を機能させる方法がわかりません。私は基本的に、マウスが画像をクリックしたことを検出し、マウスと一緒に画像を上下左右に動かしたいと考えています。

現時点では、基本的に、イベントを検出し、イベントの種類に応じてさまざまなことを行う MouseFilter クラスがあります。そのリスナーを QGraphicsView オブジェクトにアタッチしました

4

3 に答える 3

52

誰かが自分でそれを行う方法を疑問に思っている場合、それは実際には非常に簡単です. 私のアプリのコードは次のとおりです。

class ImageView : public QGraphicsView
{
public:
    ImageView(QWidget *parent);
    ~ImageView();

private:
    virtual void mouseMoveEvent(QMouseEvent *event);
    virtual void mousePressEvent(QMouseEvent *event);
    virtual void mouseReleaseEvent(QMouseEvent *event);

    bool _pan;
    int _panStartX, _panStartY;
};

たとえば、次のようにドラッグの開始位置を保存する必要があります (私は右ボタンを使用しました)。

void ImageView::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::RightButton)
    {
        _pan = true;
        _panStartX = event->x();
        _panStartY = event->y();
        setCursor(Qt::ClosedHandCursor);
        event->accept();
        return;
    }
    event->ignore();
}

また、フラグをクリアし、ボタンが離されたらカーソルを復元する必要があります。

void ImageView::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::RightButton)
    {
        _pan = false;
        setCursor(Qt::ArrowCursor);
        event->accept();
        return;
    }
    event->ignore();
}

ドラッグを実際に管理するには、マウス移動イベントをオーバーライドする必要があります。QGraphicsView は QAbstractScrollArea を継承し、スクロールバーに簡単にアクセスできます。パン位置も更新する必要があります。

void ImageView::mouseMoveEvent(QMouseEvent *event)
{
    if (_pan)
    {
        horizontalScrollBar()->setValue(horizontalScrollBar()->value() - (event->x() - _panStartX));
        verticalScrollBar()->setValue(verticalScrollBar()->value() - (event->y() - _panStartY));
        _panStartX = event->x();
        _panStartY = event->y();
        event->accept();
        return;
    }
    event->ignore();

}
于 2011-03-01T16:02:35.373 に答える
17

QGraphicsViewには、組み込みのマウスパンサポートがあります。正しいDragModeを設定すると、残りが処理されます。それを機能させるには、有効なスクロールバーが必要です。

于 2011-01-21T00:29:41.247 に答える