C++ 子类化QGraphicsView,自定义鼠标事件

C++ 子类化QGraphicsView,自定义鼠标事件,c++,qt,events,mouseevent,qgraphicsview,C++,Qt,Events,Mouseevent,Qgraphicsview,我是QGraphicsView的子类,我想做的是:如果鼠标移动时按下中键,那么我们就像使用常规的QGraphicsView操作过程一样,但按下左键会滑动图像 我试着编码,但似乎不起作用,我也不知道为什么 void MyQGraphicsView::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() == Qt::MidButton) { QMouseEvent event2(QEvent::Mo

我是QGraphicsView的子类,我想做的是:如果鼠标移动时按下中键,那么我们就像使用常规的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指出的明显错误。

存在一些问题。首先,测试条件应该使用
testFlags
,而不是
=
。其次,您正在使用
Qt::MidButton
创建事件,它应该是
Qt::LeftButton
。最后,您还需要对
mousePressEvent
执行类似的测试(以便QGraphicsView可以知道如何启动手动拖动)


您的目标似乎是将“手动拖动”模式的触发按钮从左键更改为中键

虽然事件更改方法可以工作,但它存在一些问题:当
QGraphicsView
处于“手动拖动”模式时,它仍然会传播左键单击,但随后不会拖动到场景/项目中。这意味着,如果您单击鼠标中键并在不拖动的情况下释放,它将认为您单击鼠标左键并在不拖动的情况下释放。您将有效地触发对场景的左键单击

您可以替代中键单击的行为来直接滚动场景。此代码取自
QGraphicsView::mouseMoveEvent()


这就是我目前的代码:
if(event->buttons().testFlag(Qt::MidButton)){QMouseEvent-event2(QEvent::MouseMove,event->pos(),Qt::NoButton,Qt::LeftButton,Qt::NoModifier);QGraphicsView::mousemoveent(&event2);}
它不做我想做的事情,但测试似乎很好,因为它不做我在
elif
中所做的事情,之后我确信它能工作。@Leo我只是用橡皮筋阻力测试了它。事实证明,使用滚动手拖动,您也需要重新实现mousePressEvent。请参阅编辑。谢谢,它现在可以工作了,唯一的问题是我必须按下一个新按钮才能停止此行为,仅释放中间按钮是不够的。@Leo那么您似乎必须对mouseReleaseEvent执行同样的操作。我把那个留给你谢谢,成功了!对于寻找mouseReleaseEvent的任何人来说,这里有一点不同:
if(!event->buttons().testFlag(Qt::MidButton)){QMouseEvent event2(QEvent::MouseButtonRelease,event->pos(),Qt::LeftButton,Qt::MidButton | Qt::RightButton,Qt::NoModifier);QGraphicsView::mouseReleaseEvent(&event2)}
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);
    }
}
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);
}