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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: (РЕШЕНО) Событие при наведении на QGraphicsLineItem  (Прочитано 10986 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Февраль 04, 2015, 12:51 »

Мне надо ловить события при наведении на нарисованные с помощью setLine(...) соединительные линии. Линии могут идти под разными углами. Еще не начинал делать, поскольку не ясно как именно. Насколько я понимаю, boundingRect() вокруг линии, проведенной под углом - это будет прямоугольник, у которого линия является диагональю. То есть, если просто в классе, наследующем QGraphicsLineItem переопределить hoverEnterEvent(...), то ловиться будет по всей сцене, если линию провести от угла до угла сцены.

Или нет? Или как сделать, чтобы курсор ловился только на линии, и причем с возможностью задать ширину зоны захвата?

Просто именно такие вопросы еще ни разу не решал, тем более с Qt, поэтому не вполне ясно, как с его средствами это реализовывать.
« Последнее редактирование: Февраль 25, 2015, 17:29 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #1 : Февраль 04, 2015, 13:11 »

Помнится была темка с похожим вопросом - как линию поймать. Но вроде так до конца и не разобрались - ховеревент и проверка принадлежности пикселя к линии не подходят - слишком большая погрешность.

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Февраль 04, 2015, 16:07 »

Посчитать расстояние от точки до отрезка
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #3 : Февраль 04, 2015, 16:21 »

Посчитать расстояние от точки до отрезка

Где? В приемнике hoverEnterEvent(...)? Теперь представим себе, что линий дофига, и их boundingRect перекрываются. Все приёмники будут дружно и совершенно бесполезно считать эти расстояния. И еще придется нудно со всеми разбираться, кто выше, кто ниже.
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Февраль 04, 2015, 16:26 »

Теперь представим себе, что линий дофига, и их boundingRect перекрываются. Все приёмники будут дружно и совершенно бесполезно считать эти расстояния. И еще придется нудно со всеми разбираться, кто выше, кто ниже.
А вы ждете, что Qt это чудесным образом решит? Кто-то все это должен будет сделать. Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Февраль 04, 2015, 16:32 »

Теперь представим себе, что линий дофига, и их boundingRect перекрываются. Все приёмники будут дружно и совершенно бесполезно считать эти расстояния. И еще придется нудно со всеми разбираться, кто выше, кто ниже.
А вы ждете, что Qt это чудесным образом решит? Кто-то все это должен будет сделать. Улыбающийся

Это само собой. Но если просчитывать все boundingRect, то практически любое перемещение курсора будет вызывать кучу этих по идее ненужных действий. То есть, оно всё надо, но только когда курсор оказывается вблизи линии.

Попутно любопытно стало - а сильно бы просела производительность всей этой графической иерархии, если бы у boundingRect имелся бы еще и угол поворота.
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Февраль 04, 2015, 16:52 »

Где? В приемнике hoverEnterEvent(...)? Теперь представим себе, что линий дофига, и их boundingRect перекрываются. Все приёмники будут дружно и совершенно бесполезно считать эти расстояния. И еще придется нудно со всеми разбираться, кто выше, кто ниже.
В mouseMoveEvent. Если нужно - определить какой айтем(ы) под мышей. Если "дофига" < 100, то расходы смешные.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #7 : Февраль 04, 2015, 17:06 »

Где? В приемнике hoverEnterEvent(...)? Теперь представим себе, что линий дофига, и их boundingRect перекрываются. Все приёмники будут дружно и совершенно бесполезно считать эти расстояния. И еще придется нудно со всеми разбираться, кто выше, кто ниже.
В mouseMoveEvent. Если нужно - определить какой айтем(ы) под мышей. Если "дофига" < 100, то расходы смешные.

Хех... Так оно же определяет какой айтем под мышей именно по boundingRect айтемов, чего для линий делать не имеет смысла. То есть, это означает, что надо заводить собственный реестр только для линий, и на каждом движении мыши проверять не находится ли курсор над точкой какой-либо из них +- 2 точки в стороны перепендикулярно линии. И еще при этом обработать перекрытия линий. Вау...
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Февраль 04, 2015, 17:22 »

Хех... Так оно же определяет какой айтем под мышей именно по boundingRect айтемов, чего для линий делать не имеет смысла. То есть, это означает, что надо заводить собственный реестр только для линий, и на каждом движении мыши проверять не находится ли курсор над точкой какой-либо из них +- 2 точки в стороны перепендикулярно линии. И еще при этом обработать перекрытия линий. Вау...
Какой "реестр" - метод items вернет список всех, отсекаете "нелинии" напр с помощью qobject_cast. И какое там "вау" - это банальная задача для первокурсника.
Записан
Bepec
Гость
« Ответ #9 : Февраль 04, 2015, 17:38 »

Нуу я бы так не сказал. Но вдруг Igors прав, попробуйте )
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #10 : Февраль 04, 2015, 17:40 »

Хех... Так оно же определяет какой айтем под мышей именно по boundingRect айтемов, чего для линий делать не имеет смысла. То есть, это означает, что надо заводить собственный реестр только для линий, и на каждом движении мыши проверять не находится ли курсор над точкой какой-либо из них +- 2 точки в стороны перепендикулярно линии. И еще при этом обработать перекрытия линий. Вау...
Какой "реестр" - метод items вернет список всех, отсекаете "нелинии" напр с помощью qobject_cast. И какое там "вау" - это банальная задача для первокурсника.

Для первокурсника - может быть. Смеющийся Я когда-то на первом курсе любые интегралы щелкал, как сёмочки... Не, понятно, что всё это можно сделать, но как бы... при таком мощном фреймворке проделывать вручную некие нижнеуровневые вычисления, которые должны быть у него в комплекте.  В замешательстве

Собственно items() с отсечкой не-линий, этот реестр и вернёт.
« Последнее редактирование: Февраль 04, 2015, 17:46 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Февраль 04, 2015, 18:00 »

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

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #12 : Февраль 04, 2015, 18:07 »

Спс. Это я и сам могу написать, элементарная геометрия. Просто это наверняка в потрохах есть. Вполне могло бы быть доступно, например, как метод класса QGraphicsLineItem. Там есть какой-то bool QGraphicsLineItem::contains ( const QPointF & point ), но пока не разобрался, как именно он работает.
« Последнее редактирование: Февраль 04, 2015, 18:24 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #13 : Февраль 06, 2015, 00:08 »

Хм... А ведь линия отзывается на мышь не в таком boundingRect, как я думал.
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Февраль 06, 2015, 03:49 »

Хм... А ведь линия отзывается на мышь не в таком boundingRect, как я думал.
В методе:
QPainterPath QGraphicsItem::shape () const [virtual]
можно более детельно описать форму объекта.
Фигура проверяется уже после положительной проверки на бокс.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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