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

时间:2012-06-21 19:22:58

标签: c++ qt events mouseevent qgraphicsview

我是QGraphicsView的子类,我想做的是:如果在鼠标移动时按下MidButton,那么我们就好像我们使用常规的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);
    }
}

任何帮助都将不胜感激。

编辑:删除了安东尼指出的明显错误。

2 个答案:

答案 0 :(得分:2)

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

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);
    }
}

答案 1 :(得分:0)

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

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

您可以改为覆盖中间点击的行为以直接滚动场景。此代码取自QGraphicsView::mouseMoveEvent()

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);
}