Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: dnc2rt от Декабрь 13, 2010, 10:49



Название: QGraphicsView - ScrollHandDrag - на ПКМ
Отправлено: dnc2rt от Декабрь 13, 2010, 10:49
Доброго времени суток!
В QGraphicsView необходимо ScrollHandDrag переназначить с левой кнопки на правую. Не очень удобно зажимать ctrl+ЛКМ, когда можно действие повесить на свободную ПКМ.
Может кто уже сталкивался... пока решения с малой кровью не нашел.


Название: Re: QGraphicsView - ScrollHandDrag - на ПКМ
Отправлено: sergeyostu от Январь 27, 2017, 19:56
Примерно так для средней кнопки мыши. Для правой аналогично просто в готовом коде она нужна для вызова контекстного меню.
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);
 
   }
}