Такая ситуация:
Есть два класса унаследованных от QGraphicsView и QGraphicsItem.
У QGraphicsView переопределен mouseMoveEvent(QMouseEvent* event), для скролла сцены.
Также есть множество QGraphicsItem, некоторые из них можно перемещать (setFlag(QGraphicsItem::ItemIsMovable)).
Проблема в том, что на самом деле из перемещать нельзя, так как mouseMoveEvent у QGraphicsView вызывается как раз когда ты пытаешься перетащить элемент, и перетаскивается вся сцена вместо QGraphicsItem.
Решение, в общем-то ясно - нужно в mouseMoveEvent отслеживать, не началось ли перетаскивание элемента на сцене, и если началось, не двигать сцену. Но как узнать у сцены, что в данный момент активно перетаскивание?
В общем, как-то так:
void MyView::mouseMoveEvent(QMouseEvent* event) {
static QPoint previousPoint = event->pos();
if( event->buttons() & Qt::LeftButton /*&& !scene()->isItemsMoves()
*/ ) {
addOffset( event->pos() - previousPoint );
updateTransform( scale(), offset() );
}
previousPoint = event->pos();
QGraphicsView::mouseMoveEvent(event);
}
Пока я сделал так, что есть какая-то глобальная переменная, и каждый раз когда происходит клик перемещаемом QGraphicsItem эта переменная ставится в 1, когда отпускает в 0, и в mouseMoveEvent происходит проверка этой переменной. Но это не самое лучшее решение. Есть какие идеи?