я создал QPropertyAnimation
и подключил его к моему SonogramWidget
которые прокручивают длинную картинку вертикально на события анимации. «Длинное изображение» состоит из 100 предварительно рассчитанных объектов QPixmap 1024×128, расположенных один за другим вертикально. Они отображаются в SonogramWidget::paintEvent()
с QPainter
, Процедура рисования рисует не все QPixmap
сразу, но виден только из них, учитывая высоту виджета и текущее вертикальное смещение. Процессор практически бесплатный, потому что QPixmap
это самый быстрый способ показать картинку. Во время прокрутки нет больших вычислений, потому что все 100 QPixmaps
предварительно рассчитаны и сохранены в памяти.
Я вижу странный эффект: пульсирующее движение: 2 раза в секунду все изображение слегка ускоряется и движется вверх на 1..2 пикселя быстрее, чем обычное движение. Тот же эффект, когда я заменяю Qt Animation Framework одним QTimer со скоростью 60 кадров в секунду и прокручиваю изображение в его слоте.
Видео: http://www.youtube.com/watch?v=KRk_LNd7EBg#t=8 (смотреть с 00:08; Мой Firefox добавляет больше измельчения к самому воспроизводимому видео, Google Chrome воспроизводит видео намного лучше).
Я вижу тот же эффект для моей сборки Linux и Windows.
РЕШЕНИЕ
Я понял проблему: «рубить» не было ошибкой, это была фича! Это особенность вычислений целых чисел, поэтому иногда нам приходилось иметь разные числа для анимации, например: 16,16,16,16,16,16,17
, 16,16,16,16,16,17
, ….
в paintEvent
добавить следующее утверждение:
Q_ASSERT(m_animation->currentValue() == m_animatedPropertyValue);
Если это срабатывает, то вы знаете, что вы должны использовать currentValue()
вместо значения свойства. Это может быть так. Дай мне знать.
Других решений пока нет …