1

ラバーバンドドラッグを有効にすると、ホイールイベントがマウスの下でズームしなくなるという、この奇妙な動作に悩まされています。ズームはしますが、マウスの位置に関係ありません。他のイベントを無効にすると、wheelEvent は正しく機能します。

QGraphicsView を次のように継承するカスタム クラスがあります。

class MyGraphics : public QGraphicsView{

public :
    MyGraphics(QWidget *parent = NULL);

public slots:
     void zoomIn() { scale(1.2, 1.2); }
     void zoomOut() { scale(1 / 1.2, 1 / 1.2); }

protected :
   QRubberBand *rubberBand;
   QPoint       origin;
   QPointF      InitialCenterPoint;
   QPointF      CurrentCenterPoint;
   QPoint       rubberBandOrigin;
   bool         rubberBandActive;
   QPoint       LastPanPoint;
   int          _numScheduledScalings;

//if I uncomment these three event handlers, the wheelevent doesnt zoom properly!

 //  virtual void mousePressEvent(QMouseEvent *event);
 //  virtual void mouseMoveEvent(QMouseEvent *event);
 //  virtual void mouseReleaseEvent(QMouseEvent *event);
   virtual void wheelEvent(QWheelEvent *);
   virtual void resizeEvent(QResizeEvent *event);

};

コンストラクター:

MyGraphics::MyGraphics(QWidget *parent) : QGraphicsView(parent){
    setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);

    this->installEventFilter(this);
    this->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
    this->setResizeAnchor( QGraphicsView::AnchorUnderMouse );
    QGraphicsScene *graphScene = new QGraphicsScene(this);

    this->setScene(graphScene);
    QGraphicsItem* pEllipse = graphScene->addEllipse(0,100,50,50);
    QGraphicsItem* pRect = graphScene->addRect(200,100,50,50);

    pEllipse->setFlag(QGraphicsItem::ItemIsSelectable, true);
    pRect->setFlag(QGraphicsItem::ItemIsSelectable, true);

    setSceneRect(0, 0, 1000, 1000);
    rubberBandOrigin = QPoint(0,0);
}

イベント ハンドラー:

void MyGraphics::wheelEvent(QWheelEvent *event){
    if(event->delta() > 0){
        //Zoom in
        this->zoomIn();
    } else {
        this->zoomOut();
    }

}

/*
void MyGraphics::mousePressEvent(QMouseEvent *event)
{
        if (event->button() == Qt::MiddleButton) {
        rubberBandOrigin = event->pos();
        rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
        rubberBand->setGeometry(event->x(),event->y(),0, 0);
        rubberBand->show();
        rubberBandActive = true;
    }
if(event->button() == Qt::LeftButton){
    LastPanPoint = event->pos();
}


}

void MyGraphics::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() == Qt::MiddleButton && rubberBandActive == true){
        rubberBand->resize( event->x()-rubberBandOrigin.x(), event->y()-rubberBandOrigin.y() );
    }
    else{
        if(!LastPanPoint.isNull()) {
            //Get how much we panned
            QGraphicsView * view = static_cast<QGraphicsView *>(this);

            QPointF delta = view->mapToScene(LastPanPoint) - view->mapToScene(event->pos());
            LastPanPoint = event->pos();
        }
    }
}

void MyGraphics::mouseReleaseEvent(QMouseEvent *event)
{
   if (event->button() == Qt::MiddleButton){
        QGraphicsView * view = static_cast<QGraphicsView *>(this);

        QPoint rubberBandEnd = event->pos();

        QRectF zoomRectInScene = QRectF(view->mapToScene(rubberBandOrigin), view->mapToScene(rubberBandEnd));
        QPointF center = zoomRectInScene.center();

        view->fitInView(zoomRectInScene, Qt::KeepAspectRatio);
        rubberBandActive =  false;
        delete rubberBand;
    }
    else{
        LastPanPoint = QPoint();
    }
}
*/

どこが間違っているのか、どうすれば修正できるのでしょうか?

4

1 に答える 1

1

QGraphicsView::scale関数の動作は、マウスの位置によって異なります。によって自動的かつ内部的に実行されQGraphicsViewます。scaleマウスの位置を関数に渡さないのでQGraphicsView、マウスを追跡し、最後の位置を独自に記憶していると思います。

マウス イベント ハンドラーを再実装することで、この機能を利用できます。元のハンドラーが呼び出されないため、ビューはマウスの位置を判断できなくなります。

幸いなことに、この問題は簡単に修正できます。独自の前に基本クラスの実装を呼び出す必要があります。

void MyGraphics::mousePressEvent(QMouseEvent *event) {
  QGraphicsView::mousePressEvent(event);
  // your implementation goes here
}

これは例ですmousePressEventが、デフォルトの動作の一部を無効にする必要がない限り、すべてのイベント ハンドラーに同様のステートメントを追加する必要があります。

于 2013-06-29T19:11:02.350 に答える