асинхронная (своего рода) анимация в qml

#qt #animation #qml

#qt #Анимация #qml

Вопрос:

допустим, у меня есть следующие компоненты QML:

Foo.qml

 import Qt 4.7

Rectangle {
  Repeater {
    model: myModel
    delegate: Bar {
      barProp: elemProp
    }
  }
}
  

Bar.qml

 import Qt 4.7

Rectangle {
  property string barProp: ""

  Text {
    text: barProp

    NumberAnimation on x {
      from: 0; to: 100
      duration: 1000
      loops: Animation.Infinite
    }
  }
}
  

Я поддерживаю свою модель из C , она имеет следующее объявление Q_PROPERTY:

 Q_PROPERTY (QDeclarativeListProperty <Bar> myModel READ myModel
            NOTIFY myModelChanged)
  

Теперь моя проблема в том, что каждый раз, когда я добавляю новый элемент к базовому QList , анимация, указанная в Bar , сбрасывается, поэтому на практике элементы всегда полностью перекрываются. Чего я хочу, так это того, чтобы анимации элементов не были синхронными, и каждый из них мог беспрепятственно продолжаться независимо от остальных. Возможно ли это сделать?

Приветствия

Ответ №1:

Вам следует использовать QAbstractItemModel (QStandardItemModel может быть проще всего), а не QList. QAbstractItemModel уведомляет представление о вставке / удалении / перемещении новых элементов, и представление реагирует соответствующим образом, изменяя свое содержимое. В отличие от этого, представление ничего не знает об изменениях, внесенных в QList; только то, что что-то изменилось. Это означает, что у списка нет другого выбора, кроме как уничтожить и воссоздать всех делегатов.