QGraphicsView同时使用dragMoveEvent,mouseMoveEvent,mousePressEvent

时间:2013-12-12 08:42:55

标签: qt drag mousemove qgraphicsview

在QGraphicsView中,

setDragMode(QGraphicsView::ScrollHandDrag);

这行代码完成了我想要的:拖动时滚动内容。但是,如果我为自定义需求实施了mouseMoveEventmousePressEvent,那么setDragMode(QGraphicsView::ScrollHandDrag)魔法就会消失。

这些内置函数似乎有一些依赖关系,大多数情况下它们都很方便,但是当你实现其中一个时,你就会分解这些依赖关系之间的链,以便它们中的一些消失。

我不想从头开始实现所有这些功能。如何解决这个难题?

==================编辑12/13 ================

好的,我正在尝试但是......

void MyView::mouseMoveEvent( QMouseEvent* event )
{

    // Notice: event->button() always return Qt::NoButton for "mouse move events"
    // so event->button() == Qt::LeftButton won't work in this case
    if(event->buttons() & Qt::LeftButton)
    {
        this->dragMoveEvent(dynamic_cast<QDragMoveEvent*>(event));
    }
    else
    {
        ...
    }


}

这些代码失败,因为QMouseEvent*无法转换为QDragMoveEvent*,任何想法?

1 个答案:

答案 0 :(得分:0)

@thuga是对的。在子类函数的末尾添加对原始函数的引用。像这样:

void MyGraphicsView::mouseMoveEvent(QMouseEvent * e)
{
    static QPoint oldPos;
        if(!m_not_dragging)
        {
                // some logic for drawing something based on the mouse move
            // Edit added this function call.
            doMyDrag(e->pos(), oldPos);
            oldPos = e->pos();
        }
        else
        {
                QGraphicsView::mouseMoveEvent(e);
        }
}
// EDIT added the two functions below
void MyGraphicsView::dragMoveEvent(QMouseEvent * e)
{
    static QPoint oldPos;
    doMyDrag(e->pos(), oldPos);
    oldPos = e->pos();

    QGraphicsView::dragMoveEvent(e);
}

void MyGraphicsView::doMyDrag(QPoint new, QPoint old)
{
    // common drawing logic for both official drag events 
    //and pseudo drag events.
}

您甚至可以在此函数调用中根据m_not_dragging确定e->button(),但这是您可以同时使用自定义方法和默认方法的一种快速示例。< / p>

希望有所帮助。