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()
, чтобы она включалась нажатием колеса?
Это отличная работа! Я связал его с вызовами setInteractive true/false и setDragMode ScrollHandDrag/NoDrag для событий пресса и выпуска соответственно – Shootfast
@Shootfast Отличный материал. То же самое. –
Это может не работать должным образом, если вам нужно событие LeftButton для чего-то другого. Альтернативный подход описан здесь: https://stackoverflow.com/a/5156978/2055281 – user31208