Russian Qt Forum
Ноябрь 01, 2024, 04:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsView - ScrollHandDrag - на ПКМ  (Прочитано 3788 раз)
dnc2rt
Гость
« : Декабрь 13, 2010, 10:49 »

Доброго времени суток!
В QGraphicsView необходимо ScrollHandDrag переназначить с левой кнопки на правую. Не очень удобно зажимать ctrl+ЛКМ, когда можно действие повесить на свободную ПКМ.
Может кто уже сталкивался... пока решения с малой кровью не нашел.
Записан
sergeyostu
Гость
« Ответ #1 : Январь 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);
 
   }
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.125 секунд. Запросов: 21.