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

C++ Qt:实现平移(拖动)的正确方法,c++,qt,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

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);
}
这在很大程度上是可行的。但例如,如果我将标识矩阵缩放1000000,此方法将失败并停止平移(就像视图被卡住一样)。使用
setDragMode()时不会出现此问题。


setDragMode()
的正确自定义实现是什么,这样它就可以通过滚轮点击来启用?

这对我来说很有用。。。它诱使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);
}

这是一个很好的解决方案!我还为新闻发布事件调用了setInteractive true/false和setDragMode ScrollHandDrag/NodeRagrespectively@Shootfast好东西。做了相同的操作。如果您需要LeftButton事件来执行其他操作,则此操作可能无法按预期工作。这里描述了另一种方法:我认为它将按预期工作,因为它不会以任何方式更改GridView对真正的左按钮事件的响应(左按钮事件只是在if e->button()==MidButton测试中失败,因此代码调用超类的方式与往常一样)