Название: (UPD) Как же устроено движение дочерних элементов в QGraphicsScene Отправлено: kdvdmitryor1 от Ноябрь 19, 2015, 17:29 У меня такая ситуация. Есть два элемента, у них есть свои дочерние элементы. Я обнаружил такую штуку в отладке, что когда двигаешь один элемент и за ним двигаются его дочерние, то не всегда дочерние элементы "успевают" за базовым, что для меня очень критично.
Как я это обрнаружил? Вообще все обработку я делаю на QGraphicsItem::mouseMoveEvent, там то я и поставил определенные проверки. Суть обработок такова. Я двигаю основной элемент и пока он двигается делаю кое-какие обработки, учитывая позиции дочерних элементов. Суть проверок такова. У меня boundingRect элемента фиксированный и не включает в себя дочерние. Дочерние элементы распологаются совсем вблизи boundingRect основного элемента. На какой-то момент времени один проверяемых дочерних элементов оказался внутри boundingRect основного элемента, что быть не должно. Мне об этом рассказал qDebug. Визуально ничего не заметно. Я подозреваю, что где-то не там ставлю обработку. Делать ее в QGraphicsItem::mouseMoveEvent наверное плохо. Я подозреваю, что какое-то событие не произошло, дочерние элементы не успели подвинуться. Товарищи кутешники, скажите где рыть? Где сделать обработку? В каком методе? Я попробовал делать эту обработку в сцене в QGraphicsScene::mouseMoveEvent (не помогло). Я пробовал делать postEvent для обработки (снова критически важные позиции дочерних элементов дали баг). Название: Re: Как же устроено движение дочерних элементов в QGraphicsScene Отправлено: Bepec от Ноябрь 19, 2015, 17:43 На мой взгляд вполне логичная ситуация. Сначала двигается главный, потом дочерние. Вы можете его хоть на все дочерние натянуть при желании, и в этот момент они будут находиться под ним. Но в следующий момент будет перерасчёт положения и они подвинутся куда надо.
А какая проблема с этим связана? PS нет проблемы - не стоит беспокоится. Название: Re: Как же устроено движение дочерних элементов в QGraphicsScene Отправлено: kdvdmitryor1 от Ноябрь 19, 2015, 18:18 Да вся проблема в том, что я строю линии от одного дочернего элемента к другому делая обходы с помощью алгоритма поиска маршрута. Получается так, что дочерний элемент когда начинает находится внутри своего основного, становится непроходимым (делаю проверку на наличие основных элементов в клеточке).
Мне бы такую вызвать все это из такой функции, где все дочерние элементы уже подвинуты вслед за их основным. Но такую функцию еще ненагуглил. Буду пробовать вызывать обработку в методе itemChange дочернего элемента. Название: Re: Как же устроено движение дочерних элементов в QGraphicsScene Отправлено: Bepec от Ноябрь 19, 2015, 22:34 хм... эта проверка нужна минимум в 2 местах.
В mouseMove дочернего и mouseMove родителя, не? Название: Re: Как же устроено движение дочерних элементов в QGraphicsScene Отправлено: Igors от Ноябрь 20, 2015, 10:30 ...дочерние элементы не успели подвинуться. Как будто он сам умеет двигаться. Вы же сами его двигаете - или как? Ну значит в своем расчете и надо пресекать наложение. Или я чего-то не понялНазвание: Re: Как же устроено движение дочерних элементов в QGraphicsScene Отправлено: kdvdmitryor1 от Ноябрь 24, 2015, 15:02 В общем-то я покапался в исходниках QGraphicsItem и QGraphicsScene. Все оказалось и просто и печально одновременно.
Когда позиция элемента меняется в последствии выполняется этот код. Код: QMetaMethod method = q_ptr->metaObject()->method(processDirtyItemsIndex); Что делать? (с) Чернышевский. Как обновить принудительно позиции (а вдруг несмотря на то, что то, что я нарыл, что все вызовы приводят сюда, есть еще какая-то функция)? Как принудительно доставить вызов функции по QueuedConnection (processEvents в общем случае не предлагать, с ним логика движений мышью работает ужасно неправильно)? Или как мне вызвать метод приватного класса processDirtyItemsRecursive? Название: Re: Как же устроено движение дочерних элементов в QGraphicsScene Отправлено: kdvdmitryor1 от Ноябрь 24, 2015, 17:47 Использую
Код: qApp->processEvents(QEventLoop::ExcludeUserInputEvents); Господа! Ройте исходники Qt. Дело непростое, но ответ на свой первоначальный вопрос я в какой-то степени нашел. Только помните о Pimpl (нужно пользоваться поиском "имякласса*.*" и рыть набор файлов для одного класса заголовочные и исходники). Название: Re: Как же устроено движение дочерних элементов в QGraphicsScene Отправлено: kdvdmitryor1 от Ноябрь 25, 2015, 15:33 Снова беда этими QGraphicsItem. Прошлую проблему можно сказать решил. Только когда двигаю элемент и черчу к нему линию, при движении элемента от линии остается шлейф. Сам элемент передвигается быстро, а линия от него отстает и постепенно приближается к элементу.
Киньте пожалуйста хотя бы какие-нибудь ваши соображения. Название: Re: Как же устроено движение дочерних элементов в QGraphicsScene Отправлено: Igors от Ноябрь 25, 2015, 15:41 Снова беда этими QGraphicsItem. Прошлую проблему можно сказать решил. Только когда двигаю элемент и черчу к нему линию, при движении элемента от линии остается шлейф. Сам элемент передвигается быстро, а линия от него отстает и постепенно приближается к элементу. А ведь только что звучала назидательная фразаКиньте пожалуйста хотя бы какие-нибудь ваши соображения. Господа! Ройте исходники Qt. Дело непростое, но ... :) Ну я бы рыть не спешил, а сначала поставил бы печать в paint айтема (оставляющего шлейф) и постарался бы таким образом найти откуда приходит ненужное рисование.Название: Re: (UPD) Как же устроено движение дочерних элементов в QGraphicsScene Отправлено: kdvdmitryor1 от Ноябрь 25, 2015, 15:46 Простите, парни, что я паникую. Конец сроков, время сжато, вот нервничаю. Дело было действительно в лишней перерисовке во время processEvents. В исходниках находил такие флаги на перерисовку, но вот совсем понять не мог, почему, если флаги выставляются и только потом перерисовывается, возникает такая проблема. Попробовал setUpdatesEnabled, как мне советовали в другом разделе. Заработало! Фуф (вздохнул с временным облегчением).
Название: Re: (UPD) Как же устроено движение дочерних элементов в QGraphicsScene Отправлено: kdvdmitryor1 от Ноябрь 25, 2015, 15:50 Исходники рыть - это еще после MFC Feature Pack. Справка по ней скудная, если не сказать, что никакая. Вот и где-то нашел фразу на форумах - "смотрите исходники afx...". Так мучался с этим. Это единственное, что выручало.
|