Russian Qt Forum
Ноябрь 22, 2024, 23:55
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
2D и 3D графика
>
(РЕШЕНО) Событие при наведении на QGraphicsLineItem
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: (РЕШЕНО) Событие при наведении на QGraphicsLineItem (Прочитано 11043 раз)
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
(РЕШЕНО) Событие при наведении на QGraphicsLineItem
«
:
Февраль 04, 2015, 12:51 »
Мне надо ловить события при наведении на нарисованные с помощью setLine(...) соединительные линии. Линии могут идти под разными углами. Еще не начинал делать, поскольку не ясно как именно. Насколько я понимаю, boundingRect() вокруг линии, проведенной под углом - это будет прямоугольник, у которого линия является диагональю. То есть, если просто в классе, наследующем QGraphicsLineItem переопределить hoverEnterEvent(...), то ловиться будет по всей сцене, если линию провести от угла до угла сцены.
Или нет? Или как сделать, чтобы курсор ловился только на линии, и причем с возможностью задать ширину зоны захвата?
Просто именно такие вопросы еще ни разу не решал, тем более с Qt, поэтому не вполне ясно, как с его средствами это реализовывать.
«
Последнее редактирование: Февраль 25, 2015, 17:29 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Bepec
Гость
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #1 :
Февраль 04, 2015, 13:11 »
Помнится была темка с похожим вопросом - как линию поймать. Но вроде так до конца и не разобрались - ховеревент и проверка принадлежности пикселя к линии не подходят - слишком большая погрешность.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #2 :
Февраль 04, 2015, 16:07 »
Посчитать расстояние от точки до отрезка
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #3 :
Февраль 04, 2015, 16:21 »
Цитата: Igors от Февраль 04, 2015, 16:07
Посчитать расстояние от точки до отрезка
Где? В приемнике hoverEnterEvent(...)? Теперь представим себе, что линий дофига, и их boundingRect перекрываются. Все приёмники будут дружно и совершенно бесполезно считать эти расстояния. И еще придется нудно со всеми разбираться, кто выше, кто ниже.
Записан
2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #4 :
Февраль 04, 2015, 16:26 »
Цитата: Гурман от Февраль 04, 2015, 16:21
Теперь представим себе, что линий дофига, и их boundingRect перекрываются. Все приёмники будут дружно и совершенно бесполезно считать эти расстояния. И еще придется нудно со всеми разбираться, кто выше, кто ниже.
А вы ждете, что Qt это чудесным образом решит? Кто-то все это должен будет сделать.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #5 :
Февраль 04, 2015, 16:32 »
Цитата: Old от Февраль 04, 2015, 16:26
Цитата: Гурман от Февраль 04, 2015, 16:21
Теперь представим себе, что линий дофига, и их boundingRect перекрываются. Все приёмники будут дружно и совершенно бесполезно считать эти расстояния. И еще придется нудно со всеми разбираться, кто выше, кто ниже.
А вы ждете, что Qt это чудесным образом решит? Кто-то все это должен будет сделать.
Это само собой. Но если просчитывать все boundingRect, то практически любое перемещение курсора будет вызывать кучу этих по идее ненужных действий. То есть, оно всё надо, но только когда курсор оказывается вблизи линии.
Попутно любопытно стало - а сильно бы просела производительность всей этой графической иерархии, если бы у boundingRect имелся бы еще и
угол поворота
.
Записан
2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #6 :
Февраль 04, 2015, 16:52 »
Цитата: Гурман от Февраль 04, 2015, 16:21
Где? В приемнике hoverEnterEvent(...)? Теперь представим себе, что линий дофига, и их boundingRect перекрываются. Все приёмники будут дружно и совершенно бесполезно считать эти расстояния. И еще придется нудно со всеми разбираться, кто выше, кто ниже.
В mouseMoveEvent. Если нужно - определить какой айтем(ы) под мышей. Если "дофига" < 100, то расходы смешные.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #7 :
Февраль 04, 2015, 17:06 »
Цитата: Igors от Февраль 04, 2015, 16:52
Цитата: Гурман от Февраль 04, 2015, 16:21
Где? В приемнике hoverEnterEvent(...)? Теперь представим себе, что линий дофига, и их boundingRect перекрываются. Все приёмники будут дружно и совершенно бесполезно считать эти расстояния. И еще придется нудно со всеми разбираться, кто выше, кто ниже.
В mouseMoveEvent. Если нужно - определить какой айтем(ы) под мышей. Если "дофига" < 100, то расходы смешные.
Хех... Так оно же определяет какой айтем под мышей именно по boundingRect айтемов, чего для линий делать не имеет смысла. То есть, это означает, что надо заводить собственный реестр только для линий, и на каждом движении мыши проверять не находится ли курсор
над точкой
какой-либо из них +- 2 точки в стороны перепендикулярно линии. И еще при этом обработать перекрытия линий. Вау...
Записан
2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #8 :
Февраль 04, 2015, 17:22 »
Цитата: Гурман от Февраль 04, 2015, 17:06
Хех... Так оно же определяет какой айтем под мышей именно по boundingRect айтемов, чего для линий делать не имеет смысла. То есть, это означает, что надо заводить собственный реестр только для линий, и на каждом движении мыши проверять не находится ли курсор
над точкой
какой-либо из них +- 2 точки в стороны перепендикулярно линии. И еще при этом обработать перекрытия линий. Вау...
Какой "реестр" - метод items вернет список всех, отсекаете "нелинии" напр с помощью qobject_cast. И какое там "вау" - это банальная задача для первокурсника.
Записан
Bepec
Гость
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #9 :
Февраль 04, 2015, 17:38 »
Нуу я бы так не сказал. Но вдруг Igors прав, попробуйте )
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #10 :
Февраль 04, 2015, 17:40 »
Цитата: Igors от Февраль 04, 2015, 17:22
Цитата: Гурман от Февраль 04, 2015, 17:06
Хех... Так оно же определяет какой айтем под мышей именно по boundingRect айтемов, чего для линий делать не имеет смысла. То есть, это означает, что надо заводить собственный реестр только для линий, и на каждом движении мыши проверять не находится ли курсор
над точкой
какой-либо из них +- 2 точки в стороны перепендикулярно линии. И еще при этом обработать перекрытия линий. Вау...
Какой "реестр" - метод items вернет список всех, отсекаете "нелинии" напр с помощью qobject_cast. И какое там "вау" - это банальная задача для первокурсника.
Для
первокурсника
- может быть.
Я когда-то на первом курсе любые интегралы щелкал, как сёмочки... Не, понятно, что всё это можно сделать, но как бы... при таком мощном фреймворке проделывать вручную некие нижнеуровневые вычисления, которые должны быть у него в комплекте.
Собственно items() с отсечкой не-линий, этот реестр и вернёт.
«
Последнее редактирование: Февраль 04, 2015, 17:46 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #11 :
Февраль 04, 2015, 18:00 »
Цитата: Гурман от Февраль 04, 2015, 17:40
... при таком мощном фреймворке проделывать вручную некие нижнеуровневые вычисления, которые должны быть у него в комплекте.
Так откуда он может знать до каких линий считать? Если нужна ф-ция для вычисления расстояния - завтра напишу (сейчас ухожу).
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #12 :
Февраль 04, 2015, 18:07 »
Спс. Это я и сам могу написать, элементарная геометрия. Просто это наверняка в потрохах есть. Вполне могло бы быть доступно, например, как метод класса QGraphicsLineItem. Там есть какой-то bool QGraphicsLineItem::contains ( const QPointF & point ), но пока не разобрался, как именно он работает.
«
Последнее редактирование: Февраль 04, 2015, 18:24 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #13 :
Февраль 06, 2015, 00:08 »
Хм... А ведь линия отзывается на мышь не в таком boundingRect, как я думал.
Записан
2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Событие при наведении на QGraphicsLineItem
«
Ответ #14 :
Февраль 06, 2015, 03:49 »
Цитата: Гурман от Февраль 06, 2015, 00:08
Хм... А ведь линия отзывается на мышь не в таком boundingRect, как я думал.
В методе:
QPainterPath QGraphicsItem::shape () const [virtual]
можно более детельно описать форму объекта.
Фигура проверяется уже после положительной проверки на бокс.
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...