【问题标题】:Subclassing QGraphicsView, custom mouse events子类化QGraphicsView,自定义鼠标事件
【发布时间】:2013-04-03 19:35:40
【问题描述】:

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

任何帮助将不胜感激。

编辑:删除了 Anthony 指出的明显错误。

【问题讨论】:

    标签: c++ qt events mouseevent qgraphicsview


    【解决方案1】:

    有一些问题。首先,测试条件应该使用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);
        }
    }
    

    【讨论】:

    • 那是我目前的代码:if (event->buttons().testFlag(Qt::MidButton)) {QMouseEvent event2(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::LeftButton, Qt::NoModifier); QGraphicsView::mouseMoveEvent(&event2);} 它没有做我想做的事情,但测试似乎很好,因为它没有做我在@987654328 中所做的事情@ 之后我确定它正在工作。
    • @Leo 我只用橡皮筋拖拽测试过它。事实证明,使用滚动手拖动,您也需要重新实现 mousePressEvent。查看修改。
    • 谢谢,它现在可以工作了,唯一的问题是我必须按下一个新按钮才能停止这种行为,仅仅释放 Midbutton 是不够的。
    • @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);}
    【解决方案2】:

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

    虽然事件更改方法有效,但它存在一些问题:当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);
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      相关资源
      最近更新 更多