0

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

任何帮助,将不胜感激。

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

4

2 回答 2

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);
    }
}
于 2012-06-21T19:41:53.053 回答
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);
}
于 2013-04-03T11:17:13.527 回答