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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: (UPD) Как же устроено движение дочерних элементов в QGraphicsScene  (Прочитано 7176 раз)
kdvdmitryor1
Гость
« : Ноябрь 19, 2015, 17:29 »

У меня такая ситуация. Есть два элемента, у них есть свои дочерние элементы. Я обнаружил такую штуку в отладке, что когда двигаешь один элемент и за ним двигаются его дочерние, то не всегда дочерние элементы "успевают" за базовым, что для меня очень критично.
Как я это обрнаружил?
Вообще все обработку я делаю на QGraphicsItem::mouseMoveEvent, там то я и поставил определенные проверки. Суть обработок такова. Я двигаю основной элемент и пока он двигается делаю кое-какие обработки, учитывая позиции дочерних элементов. Суть проверок такова. У меня boundingRect элемента фиксированный и не включает в себя дочерние. Дочерние элементы распологаются совсем вблизи boundingRect основного элемента. На какой-то момент времени один проверяемых дочерних элементов оказался внутри boundingRect основного элемента, что быть не должно. Мне об этом рассказал qDebug. Визуально ничего не заметно.
Я подозреваю, что где-то не там ставлю обработку. Делать ее в QGraphicsItem::mouseMoveEvent наверное плохо.
Я подозреваю, что какое-то событие не произошло, дочерние элементы не успели подвинуться. Товарищи кутешники, скажите где рыть? Где сделать обработку? В каком методе?
Я попробовал делать эту обработку в сцене в QGraphicsScene::mouseMoveEvent (не помогло).
Я пробовал делать postEvent для обработки (снова критически важные позиции дочерних элементов дали баг).
« Последнее редактирование: Ноябрь 25, 2015, 15:33 от kdvdmitryor1 » Записан
Bepec
Гость
« Ответ #1 : Ноябрь 19, 2015, 17:43 »

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

А какая проблема с этим связана?

PS нет проблемы - не стоит беспокоится.
Записан
kdvdmitryor1
Гость
« Ответ #2 : Ноябрь 19, 2015, 18:18 »

Да вся проблема в том, что я строю линии от одного дочернего элемента к другому делая обходы с помощью алгоритма поиска маршрута. Получается так, что дочерний элемент когда начинает находится внутри своего основного, становится непроходимым (делаю проверку на наличие основных элементов в клеточке).
Мне бы такую вызвать все это из такой функции, где все дочерние элементы уже подвинуты вслед за их основным. Но такую функцию еще ненагуглил.
Буду пробовать вызывать обработку в методе itemChange дочернего элемента.
Записан
Bepec
Гость
« Ответ #3 : Ноябрь 19, 2015, 22:34 »

хм... эта проверка нужна минимум в 2 местах.
В mouseMove дочернего и mouseMove родителя, не?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Ноябрь 20, 2015, 10:30 »

...дочерние элементы не успели подвинуться.
Как будто он сам умеет двигаться. Вы же сами его двигаете - или как? Ну значит в своем расчете и надо пресекать наложение. Или я чего-то не понял
Записан
kdvdmitryor1
Гость
« Ответ #5 : Ноябрь 24, 2015, 15:02 »

В общем-то я покапался в исходниках QGraphicsItem и QGraphicsScene. Все оказалось и просто и печально одновременно.
Когда позиция элемента меняется в последствии выполняется этот код.
Код:
        QMetaMethod method = q_ptr->metaObject()->method(processDirtyItemsIndex);
        method.invoke(q_ptr, Qt::QueuedConnection);
Этот код вызывает функцию, которая обновляет все "грязные" позиции. Но дело как раз в том, как эта функция вызывается, эта функция processDirtyItemsIndex "отложенная", вызов с параметром QueuedConnection.
Что делать? (с) Чернышевский.
Как обновить принудительно позиции (а вдруг несмотря на то, что то, что я нарыл, что все вызовы приводят сюда, есть еще какая-то функция)? Как принудительно доставить вызов функции по QueuedConnection (processEvents в общем случае не предлагать, с ним логика движений мышью работает ужасно неправильно)? Или как мне вызвать метод приватного класса processDirtyItemsRecursive?
« Последнее редактирование: Ноябрь 24, 2015, 15:20 от kdvdmitryor1 » Записан
kdvdmitryor1
Гость
« Ответ #6 : Ноябрь 24, 2015, 17:47 »

Использую
Код:
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
перед вычислениями. Пока прошлых сбоев не было.

Господа! Ройте исходники Qt. Дело непростое, но ответ на свой первоначальный вопрос я в какой-то степени нашел. Только помните о Pimpl (нужно пользоваться поиском "имякласса*.*" и рыть набор файлов для одного класса заголовочные и исходники).
« Последнее редактирование: Ноябрь 24, 2015, 22:24 от kdvdmitryor1 » Записан
kdvdmitryor1
Гость
« Ответ #7 : Ноябрь 25, 2015, 15:33 »

Снова беда этими QGraphicsItem. Прошлую проблему можно сказать решил. Только когда двигаю элемент и черчу к нему линию, при движении элемента от  линии остается шлейф. Сам элемент передвигается быстро, а линия от него отстает и постепенно приближается к элементу.
Киньте пожалуйста хотя бы какие-нибудь ваши соображения.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Ноябрь 25, 2015, 15:41 »

Снова беда этими QGraphicsItem. Прошлую проблему можно сказать решил. Только когда двигаю элемент и черчу к нему линию, при движении элемента от  линии остается шлейф. Сам элемент передвигается быстро, а линия от него отстает и постепенно приближается к элементу.
Киньте пожалуйста хотя бы какие-нибудь ваши соображения.
А ведь только что звучала назидательная фраза
Господа! Ройте исходники Qt. Дело непростое, но ...
Улыбающийся Ну я бы рыть не спешил, а сначала поставил бы печать в paint айтема (оставляющего шлейф) и постарался бы таким образом найти откуда приходит ненужное рисование.
Записан
kdvdmitryor1
Гость
« Ответ #9 : Ноябрь 25, 2015, 15:46 »

Простите, парни, что я паникую. Конец сроков, время сжато, вот нервничаю. Дело было действительно в лишней перерисовке во время processEvents. В исходниках находил такие флаги на перерисовку, но вот совсем понять не мог, почему, если флаги выставляются и только потом перерисовывается, возникает такая проблема. Попробовал setUpdatesEnabled, как мне советовали в другом разделе. Заработало! Фуф (вздохнул с временным облегчением).
Записан
kdvdmitryor1
Гость
« Ответ #10 : Ноябрь 25, 2015, 15:50 »

Исходники рыть - это еще после MFC Feature Pack. Справка по ней скудная, если не сказать, что никакая. Вот и где-то нашел фразу на форумах - "смотрите исходники afx...". Так мучался с этим. Это единственное, что выручало.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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