Как наиболее правильно / эффективно обновить Предмет, источник которого изменился?

У меня есть загруженный файл qml из файловой системы, который изменяется, однако, так как при первой загрузке он также кэшируется, он не обновляется, даже если Loader это "сброс" путем установки исходного компонента в undefined,

Подобные вопросы уже задавались ранее, однако я хотел бы пойти дальше по нескольким причинам:

  • принятые ответы там предлагают использовать engine->trimComponentCache() который, к сожалению, работает только один раз, а затем останавливается, дальнейшие обновления не отображаются
  • в комментариях ниже ФП предлагает engine->clearComponentCache() работает, и это действительно так, каждый раз. Однако документация по этому методу немного затрудняет его использование:

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

Это, безусловно, звучит зловеще, особенно выделение жирным шрифтом, поскольку я не перезагружаю все свое приложение, это всего лишь крошечная часть довольно большого приложения, которое должно оставаться в такте и в то же время обновлять этот конкретный внешний файл qml до отражать его изменения.

Вторая часть звучит немного более многообещающе:

Эта функция возвращает движок в состояние, когда он не содержит загруженных данных компонента. Это может быть полезно для перезагрузки меньшего подмножества предыдущего набора компонентов или для загрузки новой версии ранее загруженного компонента.

После очистки кэша компонентов компоненты должны быть загружены перед созданием любых новых объектов.

Таким образом, создается впечатление, что этот метод можно использовать только для перезагрузки подмножества без нарушения существующего кода. Однако, даже если это так, потребуется много дополнительной работы для перестройки всех кэшей для вновь созданных объектов, а не просто очистка кэша для конкретного источника qml, который изменяется.

Кроме того, я думал о более сложном решении, включающем создание пользовательского элемента QML, который, по сути, является оберткой вокруг совершенно нового механизма QML, который рендерится в FBO и отображает вывод в виде объекта в моем "главном" двигатель, тем самым полностью изолируя два двигателя. Однако я не очень заинтересован в том, чтобы выполнять всю эту дополнительную работу и вводить накладные расходы на другой полностью работающий двигатель.

Так есть идеи?

1 ответ

Пока кто-то не придет с лучшим решением, я тем временем обнаружил, что trimComponentCache() происходит сбой, только если очистка, обрезка и сброс происходят последовательно, то есть в одном и том же цикле цикла событий. Он работает каждый раз, когда цикл событий может вращаться между ними, поэтому я выбрал это решение, которое работает каждый раз:

  Timer {
    id: updater
    interval: 1
    repeat: true
    property int s: 0
    onTriggered: {
      switch (s) {
      case 0:
        loader.sourceComponent = undefined
        ++s
        break
      case 1:
        Aux.trim()
        ++s
        break
      case 2:
        loader.source = "file:/d:/Rect.qml"
        s = 0
        stop()
      }
    }
  }

Таким образом, обновление запускается при запуске таймера, он очищает загрузчик за один цикл, обрезает кэш в следующий, и перезагружает источник и останавливается в последнем, сбрасывая как загрузчик, так и его состояние.

Другие вопросы по тегам