Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: kdvdmitryor1 от Ноябрь 19, 2015, 17:29



Название: (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);
        method.invoke(q_ptr, Qt::QueuedConnection);
Этот код вызывает функцию, которая обновляет все "грязные" позиции. Но дело как раз в том, как эта функция вызывается, эта функция processDirtyItemsIndex "отложенная", вызов с параметром QueuedConnection.
Что делать? (с) Чернышевский.
Как обновить принудительно позиции (а вдруг несмотря на то, что то, что я нарыл, что все вызовы приводят сюда, есть еще какая-то функция)? Как принудительно доставить вызов функции по 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...". Так мучался с этим. Это единственное, что выручало.