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

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

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

Сообщений: 1442

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


Просмотр профиля
« : Февраль 18, 2015, 19:23 »

Описал шейп у графического айтема в виде прямоугольника размером больше, чем boundingRect, ну так надо. Проверяю как работает - кидаю такой айтем рядом с другим точно таким же айтемом на сцене. Далее под "падающим" я подразумеваю тот айтем, метод collidingItems() которого вызывается чтобы получить список тех, на кого он упал. Наблюдаю странное поведение - подлежащие айтемы появляются в списке только когда под шейп падающего попадает описывающий прямоугольник подлежащего, но не его шейп. Флаг по умолчанию mode = Qt::IntersectsItemShape. В доке написано:

Цитировать
The way collisions are detected is determined by applying mode to items that are compared to this item, i.e., each item's shape or bounding rectangle is checked against this item's shape.
(выделено мной)

На всякий случай явно указал параметром collidingItems( Qt::IntersectsItemShape ) - та же фигня.

Так эта... Что указывает параметр - использование шейп у падающего или подлежащих? Что должно использоваться у подлежащих айтемов? shape или boundingRect? Я вижу, что используется boundingRect - а как сделать, чтобы у них тоже shape использовался? Рыл, рыл... не нарыл...

Или это баг? Кто-нибудь еще сталкивался с таким?
« Последнее редактирование: Февраль 23, 2015, 22:54 от Гурман » Записан

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

Сообщений: 4350



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

Ну так шейп должен находиться внутри bouningRect.
Вначале идёт проверка на область, потом на фигуру.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


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

оба-на... а нигде ведь не сказано, что обязательно внутри прямоугольника, и самое смешное, что работает шейп больше прямоугольника, но только для того айтема, проверка которого вызывается

и не вполне ясно, с чего бы не работало во всех случаях - координаты то qreal, ну и что, что они отрицательные
Записан

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

Сообщений: 4350



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

Проверки идут в два этапа: сначала на бокс, а потом для тонкой проверки - на фигуру.
Если проверка показывает, что в бокс не попали, то проверка на фигуру даже не будет выполненна.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


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

Вот блин...  Обеспокоенный А мне надо проверять на некотором расстоянии от фигуры. Получается, надо перед вызовом проверки пересчитывать boundingBox, потом возвращать обратно.

Причем, если бы при флаге Qt::IntersectsItemShape проверка делалась только на шейп, игнорируя бокс - то всё бы без проблем работало.  В замешательстве

PS: а блин, нихрена не получится с подменой - надо ведь менять boundingBox для всех айтемов соответствующего типа на сцене  Злой

Выходит, единственный вариант - самому искать с кем увеличенный шейп пересекается.  В замешательстве
« Последнее редактирование: Февраль 18, 2015, 20:38 от Гурман » Записан

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

Сообщений: 4350



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

Напрасно вы делаете бокс меньше, чем сам элемент занимает. Вы ещё сможете получить артефакты при отрисовке, от которых просто так уже не избавится.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

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


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

Нет, я так не делаю. Бокс ровно такой, как элемент. Но мне нужно проверять при движении элементов, чтобы они не подходили к друг другу ближе определенного расстояния (в моем случае 2 шага сетки). Чтобы между ними всегда было некоторое расстояние. Например, если роняют один объект слишком близко к другому, чтобы он отскакивал на минимальное допустимое расстояние. Делать бокс с учетом этого расстояния не имеет никакого смысла - снаружи своего настоящего бокса сам айтем ничего никогда рисовать не будет. Проверка на расстояние чисто внешняя для айтема.
« Последнее редактирование: Февраль 23, 2015, 22:51 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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