Russian Qt Forum

Qt => Вопросы новичков => Тема начата: AlexZ от Июнь 03, 2017, 18:29



Название: Отслеживание мышки за пределами QGraphicsView
Отправлено: AlexZ от Июнь 03, 2017, 18:29
Всем привет. Не могу допереть, как захватить мышь вьюхой сцены. Мне нужно, что бы при клике по QGraphicsItem, рисовалась линия до координат курсора мышки. Проблема в том, что когда мышка выходит за пределы вьюпорта, то вьюпорт перестает получать событие движения мышкой и следовательно линия дальше не рисуется. В свою очередь если зажать мышь на QGraphicsItem и двигать мышкой за пределы вьюпорта, то событие движения мышкой отслеживается и линия рисуется на сцене за пределами QGraphicsView. Использование grabMouse() во вьюхе или в QGraphicsItem не дало нужного эффекта или я не допер как их правильно юзать. setMouseTracking у вьюпорта включен.


Название: Re: Отслеживание мышки за пределами QGraphicsView
Отправлено: Racheengel от Июнь 03, 2017, 23:35
Прочитал раза 3... Так и не понял - в чем собственно проблема?
Надо, чтобы за пределами вьюхи движение мыши не отслеживалось или как?


Название: Re: Отслеживание мышки за пределами QGraphicsView
Отправлено: Igors от Июнь 04, 2017, 07:54
то событие движения мышкой отслеживается и линия рисуется на сцене за пределами QGraphicsView.
setCiipRect перед рисованием линии


Название: Re: Отслеживание мышки за пределами QGraphicsView
Отправлено: AlexZ от Июнь 04, 2017, 08:16
Извиняюсь за то что не очень понятно объяснил.

Мне нужно, что бы, при клике мышкой (вызывается mousePressEvent и потом mouseReleaseEvent) по QGraphicsItem, мышка отслеживалась за пределами QGraphicsViewport.

На данный момент мышка отслеживается только при условии, если по QGraphicsItem происходит нажатие кнопки мышки (т.е. только mousePressEvent) без последующего отпускания кнопки (т.е. зажали кнопку). Я так понимаю в этом случае происходит захват мышки вьюпортом (стандартное поведение QGraphicsViewport). Вот мне нужно тоже самое только при клике кнопкой мыши по QGraphicsItem, а не по зажатию кнопки.


Название: Re: Отслеживание мышки за пределами QGraphicsView
Отправлено: Igors от Июнь 04, 2017, 08:25
Вот мне нужно тоже самое только при клике кнопкой мыши по QGraphicsItem, а не по зажатию кнопки.
Ну я так понимаю что "клик" = "нажал и отпустил". Тогда вешать фильтр на qApp (или перекрыть notify).


Название: Re: Отслеживание мышки за пределами QGraphicsView
Отправлено: AlexZ от Июнь 04, 2017, 11:06
Вот мне нужно тоже самое только при клике кнопкой мыши по QGraphicsItem, а не по зажатию кнопки.
Ну я так понимаю что "клик" = "нажал и отпустил". Тогда вешать фильтр на qApp (или перекрыть notify).

А можно небольшой примерчик с notify?

На данный момент проблему решил с помощью
Код:
QGraphicsView::viewport()->grabMouse();
при нажатии кнопки и
Код:
QGraphicsView::viewport()->releaseMouse();

P.S. В доке Qt разрабы не рекомендуют использовать данные методы.


Название: Re: Отслеживание мышки за пределами QGraphicsView
Отправлено: Igors от Июнь 04, 2017, 12:30
А можно небольшой примерчик с notify?
Помещать этот код в notify есть смысл если оно уже перекрыто (чтобы лишних хвильтров не плодить). Впрочем код примерно одинаков
Код
C++ (Qt)
bool MyGView::eventFilter(QObject *obj, QEvent *event)
// bool MyApp::notify(QObject *obj, QEvent *event)
{
   if (theMouseGrabFlag) {
       switch (event->type()) {
           case QEvent::MouseMove:
           case QEvent::MousePress:
           case QEvent::MouseRelease:
               MyHandleMouse(obj, event);
               break;
       }
   }
   return false;
}
 
 
// установка
qApp->installEventFilter(myGView);
 
В обработчике MyHandleMouse решаете свои проблемы и когда сбросить theMouseGrabFlag учитывая
а) событие обычно приходит "в 2 экземплярах" - сначала для QWindow а потом для виджета
б) локальная позиция мыша (static_cast<QMouseEvent *> (event)) может быть для другого виджета - ну возьмете из глобальной
в) "Жрать" MousePress/Release не надо, будут проблемы, всегда возвращайте false, пусть событие обрабатывается дальше

P.S. В доке Qt разрабы не рекомендуют использовать данные методы.
Та отож


Название: Re: Отслеживание мышки за пределами QGraphicsView
Отправлено: AlexZ от Июнь 04, 2017, 14:38
Спасибо за помощь. Работает)

Еще вот возник вопрос. Если решать задачу фильтром(как предложили вы) или как делал я с помощью grabMouse(), то QGraphicsView переставал получать события мышки, если мышка за пределами главного окна. В свою очередь, в стандартном поведении QGraphicsView при зажатой кнопки мыши(т.е. кнопка не отпускается) QGraphicsView получает события мыши. Возможно ли как-то повторить такое поведение для клика кнопкой мыши?


Название: Re: Отслеживание мышки за пределами QGraphicsView
Отправлено: Igors от Июнь 05, 2017, 10:47
Возможно ли как-то повторить такое поведение для клика кнопкой мыши?
Не знаю, но это легко проверить. В том же фильтре просто печатайте события MouseMove. Если их нет (вероятно так и будет) то фильтром не сделать. Вообще неясно что это за активность такая при НЕнажатой кнопке мыши, думается Вы напрасно ищете приключений, UI - вещь консервативная, лучше делать "как все".

Да, и кстати для отлова такого движения может проще по таймеру снимать координаты мыша?


Название: Re: Отслеживание мышки за пределами QGraphicsView
Отправлено: deMax от Июнь 05, 2017, 13:46
Рисовать линию вне зоны видимости? жесть какая то, лучше двигать изображение когда мышь у границы виджета и/или скролом масштабировать/сдвигать.

И если я захочу перейти на другое окно, я так понимаю не смогу этого сделать :o