about its state, such as the current frame and total number of frames.
The result is an animated image with a simple progress indicator underneath it.
- \b Note: Unlike images, animated images are not cached or shared internally.
+ \b Note: When animated images are cached, every frame of the animation will be cached.
+
+ Set cache to false if you are playing a long or large animation and you
+ want to conserve memory.
+
+ If the image data comes from a sequential device (e.g. a socket),
+ AnimatedImage can only loop if cache is set to true.
\clearfloat
\snippet qml/animatedimage.qml document
QQuickAnimatedImage::QQuickAnimatedImage(QQuickItem *parent)
: QQuickImage(*(new QQuickAnimatedImagePrivate), parent)
{
+ QObject::connect(this, &QQuickImageBase::cacheChanged, this, &QQuickAnimatedImage::onCacheChanged);
}
QQuickAnimatedImage::~QQuickAnimatedImage()
this, SLOT(playingStatusChanged()));
connect(d->_movie, SIGNAL(frameChanged(int)),
this, SLOT(movieUpdate()));
- d->_movie->setCacheMode(QMovie::CacheAll);
+ if (d->cache)
+ d->_movie->setCacheMode(QMovie::CacheAll);
d->status = Ready;
emit statusChanged(d->status);
{
Q_D(QQuickAnimatedImage);
+ if (!d->cache) {
+ qDeleteAll(d->frameMap);
+ d->frameMap.clear();
+ }
+
if (d->_movie) {
d->setPixmap(*d->infoForCurrentFrame(qmlEngine(this)));
emit frameChanged();
}
}
+void QQuickAnimatedImage::onCacheChanged()
+{
+ Q_D(QQuickAnimatedImage);
+ if (!cache()) {
+ qDeleteAll(d->frameMap);
+ d->frameMap.clear();
+ if (d->_movie) {
+ d->_movie->setCacheMode(QMovie::CacheNone);
+ }
+ } else {
+ if (d->_movie) {
+ d->_movie->setCacheMode(QMovie::CacheAll);
+ }
+ }
+}
+
QSize QQuickAnimatedImage::sourceSize()
{
Q_D(QQuickAnimatedImage);
void qtbug_16520();
void progressAndStatusChanges();
void playingAndPausedChanges();
+ void noCaching();
};
void tst_qquickanimatedimage::cleanup()
delete obj;
}
+
+void tst_qquickanimatedimage::noCaching()
+{
+ QQuickView window, window_nocache;
+ window.setSource(testFileUrl("colors.qml"));
+ window_nocache.setSource(testFileUrl("colors_nocache.qml"));
+ window.show();
+ window_nocache.show();
+ QTest::qWaitForWindowExposed(&window);
+ QTest::qWaitForWindowExposed(&window_nocache);
+
+ QQuickAnimatedImage *anim = qobject_cast<QQuickAnimatedImage *>(window.rootObject());
+ QVERIFY(anim);
+
+ QQuickAnimatedImage *anim_nocache = qobject_cast<QQuickAnimatedImage *>(window_nocache.rootObject());
+ QVERIFY(anim_nocache);
+
+ QCOMPARE(anim->frameCount(), anim_nocache->frameCount());
+
+ // colors.gif only has 3 frames so this should be fast
+ for (int loops = 0; loops <= 2; ++loops) {
+ for (int frame = 0; frame < anim->frameCount(); ++frame) {
+ anim->setCurrentFrame(frame);
+ anim_nocache->setCurrentFrame(frame);
+
+ QImage image_cache = window.grabWindow();
+ QImage image_nocache = window_nocache.grabWindow();
+
+ QCOMPARE(image_cache, image_nocache);
+ }
+ }
+}
+
QTEST_MAIN(tst_qquickanimatedimage)
#include "tst_qquickanimatedimage.moc"