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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отслеживание мышки за пределами QGraphicsView  (Прочитано 8757 раз)
AlexZ
Гость
« : Июнь 03, 2017, 18:29 »

Всем привет. Не могу допереть, как захватить мышь вьюхой сцены. Мне нужно, что бы при клике по QGraphicsItem, рисовалась линия до координат курсора мышки. Проблема в том, что когда мышка выходит за пределы вьюпорта, то вьюпорт перестает получать событие движения мышкой и следовательно линия дальше не рисуется. В свою очередь если зажать мышь на QGraphicsItem и двигать мышкой за пределы вьюпорта, то событие движения мышкой отслеживается и линия рисуется на сцене за пределами QGraphicsView. Использование grabMouse() во вьюхе или в QGraphicsItem не дало нужного эффекта или я не допер как их правильно юзать. setMouseTracking у вьюпорта включен.
« Последнее редактирование: Июнь 03, 2017, 23:30 от AlexZ » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Июнь 03, 2017, 23:35 »

Прочитал раза 3... Так и не понял - в чем собственно проблема?
Надо, чтобы за пределами вьюхи движение мыши не отслеживалось или как?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июнь 04, 2017, 07:54 »

то событие движения мышкой отслеживается и линия рисуется на сцене за пределами QGraphicsView.
setCiipRect перед рисованием линии
Записан
AlexZ
Гость
« Ответ #3 : Июнь 04, 2017, 08:16 »

Извиняюсь за то что не очень понятно объяснил.

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июнь 04, 2017, 08:25 »

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

Вот мне нужно тоже самое только при клике кнопкой мыши по QGraphicsItem, а не по зажатию кнопки.
Ну я так понимаю что "клик" = "нажал и отпустил". Тогда вешать фильтр на qApp (или перекрыть notify).

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

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

P.S. В доке Qt разрабы не рекомендуют использовать данные методы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июнь 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 разрабы не рекомендуют использовать данные методы.
Та отож
Записан
AlexZ
Гость
« Ответ #7 : Июнь 04, 2017, 14:38 »

Спасибо за помощь. Работает)

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

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июнь 05, 2017, 10:47 »

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

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

Сообщений: 600



Просмотр профиля
« Ответ #9 : Июнь 05, 2017, 13:46 »

Рисовать линию вне зоны видимости? жесть какая то, лучше двигать изображение когда мышь у границы виджета и/или скролом масштабировать/сдвигать.

И если я захочу перейти на другое окно, я так понимаю не смогу этого сделать Шокированный
« Последнее редактирование: Июнь 05, 2017, 13:49 от deMax » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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