Qt:实现平移(拖动)的正确方法

lam*_*bda 4 c++ qt

QGraphicsview有一种方法setDragMode(ScrollHandDrag)可以通过鼠标左键单击进行平移.但是我想在单击鼠标滚轮(中间按钮)时启用平移并创建以下自定义实现来平移:

//Within a custom derived class of QGraphicsView
//pan is true when wheel is clicked and false when released
//last Pos is defined somewhere else in the class

void GridView::mouseMoveEvent(QMouseEvent *event){
     if(pan){
         QPointF currentPos = event->pos();
         QPointF relPos = currentPos - lastPos;
         lastPos = currentPos;

         //this is what creates the panning effect
         translate(relPos.x(), relPos.y());
     }
     QGraphicsView::mouseMoveEvent(event);
}
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下都可以正常工作.但是,例如,如果我将单位矩阵缩放1,000,000,则此方法会失败并停止平移(就像视图卡住一样).我使用时不会出现此问题setDragMode()

什么是正确的自定义实现,setDragMode()所以它通过车轮点击启用?

Jer*_*ner 10

这对我有用......它欺骗Qt认为当用户真正按下中间按钮时用户按下鼠标左键.

void GridView :: mousePressEvent(QMouseEvent * e)
{
   if (e->button() == MidButton)
   {
      QMouseEvent fake(e->type(), e->pos(), LeftButton, LeftButton, e->modifiers());
      QGraphicsView::mousePressEvent(&fake);
   }
   else QGraphicsView::mousePressEvent(e);
}

void GridView :: mouseReleaseEvent(QMouseEvent * e)
{
   if (e->button() == MidButton)
   {
      QMouseEvent fake(e->type(), e->pos(), LeftButton, LeftButton, e->modifiers());
      QGraphicsView::mouseReleaseEvent(&fake);
   }
   else QGraphicsView::mouseReleaseEvent(e);
}
Run Code Online (Sandbox Code Playgroud)