Примерно так для средней кнопки мыши. Для правой аналогично просто в готовом коде она нужна для вызова контекстного меню.
QCircuitView наследуем от QGraphicsView
C++ (Qt)
QCircuitView::QCircuitView (QWidget * parent)
: QGraphicsView(parent)
{
setDragMode(QGraphicsView::RubberBandDrag);// для выделения рамкой по умолчанию
}
void QCircuitView::mousePressEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::MiddleButton)
{
// по нажатию средней кнопки мыши создаем событие ее отпускания выставляем моду перетаскивания и создаем событие зажатой левой кнопки мыши
QMouseEvent releaseEvent(QEvent::MouseButtonRelease, event->localPos(), event->screenPos(), event->windowPos(),
Qt::LeftButton, 0, event->modifiers());
QGraphicsView::mouseReleaseEvent(&releaseEvent);
setDragMode(QGraphicsView::ScrollHandDrag);
QMouseEvent fakeEvent(event->type(), event->localPos(), event->screenPos(), event->windowPos(),
Qt::LeftButton, event->buttons() | Qt::LeftButton, event->modifiers());
QGraphicsView::mousePressEvent(&fakeEvent);
}
else if (event->button()==Qt::RightButton)
{
// это что бы при вызове контекстного меню ничего постороннего не было
setDragMode(QGraphicsView::NoDrag);
QGraphicsView::mousePressEvent(event);
}
else
{
// это для выделения рамкой - работа по-умолчанию левой кнопки мыши
QGraphicsView::mousePressEvent(event);
}
}
void QCircuitView::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::MiddleButton)
{
отпускаем левую кнопку мыши которую виртуально зажали в mousePressEvent
QMouseEvent fakeEvent(event->type(), event->localPos(), event->screenPos(), event->windowPos(),
Qt::LeftButton, event->buttons() & ~Qt::LeftButton, event->modifiers());
QGraphicsView::mouseReleaseEvent(&fakeEvent);
setDragMode(QGraphicsView::RubberBandDrag);
}
else
{
QGraphicsView::mouseReleaseEvent(event);
}
}