2013-08-31 3 views
4

QGraphicsview имеет способ setDragMode(ScrollHandDrag), чтобы включить панорамирование с помощью щелчка левой кнопкой мыши. Но я хотел, чтобы позволить панорамирование когда колесо мыши нажата (средняя кнопка) и создал следующую пользовательскую реализацию на сковородке:Qt: Правильный метод для реализации панорамирования (перетаскивание)

//Within a custom derived class of QGraphicsView 
//pan is true when wheel is clicked and false when released 
//last Pos is defined somewhere else in the class 

void GridView::mouseMoveEvent(QMouseEvent *event){ 
    if(pan){ 
     QPointF currentPos = event->pos(); 
     QPointF relPos = currentPos - lastPos; 
     lastPos = currentPos; 

     //this is what creates the panning effect 
     translate(relPos.x(), relPos.y()); 
    } 
    QGraphicsView::mouseMoveEvent(event); 
} 

Это прекрасно работает по большей части. Но, например, если я масштабирую идентификационную матрицу на 1 000 000, этот метод завершится неудачей и прекратит панорамирование (как будто представление застряло). Эта проблема не возникает, когда я использую setDragMode()

Какова была бы правильная пользовательская реализация setDragMode(), чтобы она включалась нажатием колеса?

ответ

10

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

void GridView :: mousePressEvent(QMouseEvent * e) 
{ 
    if (e->button() == MidButton) 
    { 
     QMouseEvent fake(e->type(), e->pos(), LeftButton, LeftButton, e->modifiers()); 
     QGraphicsView::mousePressEvent(&fake); 
    } 
    else QGraphicsView::mousePressEvent(e); 
} 

void GridView :: mouseReleaseEvent(QMouseEvent * e) 
{ 
    if (e->button() == MidButton) 
    { 
     QMouseEvent fake(e->type(), e->pos(), LeftButton, LeftButton, e->modifiers()); 
     QGraphicsView::mouseReleaseEvent(&fake); 
    } 
    else QGraphicsView::mouseReleaseEvent(e); 
} 
+1

Это отличная работа! Я связал его с вызовами setInteractive true/false и setDragMode ScrollHandDrag/NoDrag для событий пресса и выпуска соответственно – Shootfast

+0

@Shootfast Отличный материал. То же самое. –

+0

Это может не работать должным образом, если вам нужно событие LeftButton для чего-то другого. Альтернативный подход описан здесь: https://stackoverflow.com/a/5156978/2055281 – user31208

Смежные вопросы