QGraphicsView dragMoveEvent, mouseMoveEvent, mousePressEvent используются одновременно

В QGraphicsView,

setDragMode(QGraphicsView::ScrollHandDrag);

Эта строка кода делала то, что я хочу: прокручивать содержимое при перетаскивании. Однако, если я реализовал mouseMoveEvent или mousePressEvent для своих пользовательских нужд, магия setDragMode(QGraphicsView::ScrollHandDrag) исчезла.

Кажется, что эти встроенные функции имеют некоторые зависимости, в большинстве случаев они удобны, но когда вы реализуете одну из них, вы разрываете цепочку между этими зависимостями, так что некоторые из них исчезают.

Я не хочу реализовывать все эти функции с нуля. Как решить эту дилемму?

================== Редактировать 13/12================

Хорошо, я пытаюсь, но...

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*, есть идеи?


person Alston    schedule 12.12.2013    source источник
comment
Пробовали ли вы вызывать QGraphicsView::mouseMoveEvent() и QGraphicsView::mousePressEvent() внутри ваших функций mouseMoveEvent() и mousePressEvent()?   -  person thuga    schedule 12.12.2013
comment
Спасибо за предложение. Но как мне вызвать QGraphicsView::dragMoveEvent() внутри MyView::mouseMoveEvent()?   -  person Alston    schedule 13.12.2013
comment
Зачем вам звонить QGraphicsView::dragMoveEvent внутри MyView::mouseMoveEvent()?   -  person thuga    schedule 13.12.2013
comment
Мне нужно при движении мыши 1). без нажатия левой кнопки: обнаружить событие наведения, чтобы я мог получить значение пикселя положения мыши, 2). с нажатой левой кнопкой: рассматривайте это как событие перетаскивания, чтобы действовать как setDragMode(QGraphicsView::ScrollHandDrag)   -  person Alston    schedule 14.12.2013
comment
Если вы установите режим перетаскивания QGraphicsView::ScrollHandDrag, события наведения не должны активироваться во время перетаскивания. Пока вы вызываете QGraphicsView::mouseMoveEvent из своей собственной функции mouseMoveEvent, все должно быть в порядке.   -  person thuga    schedule 16.12.2013


Ответы (1)


@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() прямо в этом вызове функции, но это быстрый пример того, как вы можете иметь доступными как ваш пользовательский метод, так и метод по умолчанию.

Надеюсь, это поможет.

person phyatt    schedule 12.12.2013
comment
Спасибо за предложение. Но как мне вызвать QGraphicsView::dragMoveEvent() внутри MyView::mouseMoveEvent()? - person Alston; 13.12.2013
comment
Если перетаскивание на самом деле не началось, вам, вероятно, следует просто использовать основные функции двух функций в третьей функции. - person phyatt; 13.12.2013