Disconnect from previous loading image when loading a new image.

Change-Id: If2fa95d9715a55d3f07ecf5f232e4f4b9a44a6fb
Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
This commit is contained in:
Michael Brasser 2013-01-23 22:02:53 -06:00 committed by The Qt Project
parent 57f593b96f
commit c5fb0a9d8a
3 changed files with 78 additions and 0 deletions

View File

@ -207,6 +207,7 @@ void QQuickImageBase::load()
options |= QQuickPixmap::Asynchronous;
if (d->cache)
options |= QQuickPixmap::Cache;
d->pix.clear(this);
d->pix.load(qmlEngine(this), d->url, d->sourcesize, options);
if (d->pix.isLoading()) {

View File

@ -0,0 +1,26 @@
import QtQuick 2.0
Item {
property alias status: image1.status
Image {
id: image1
asynchronous: true
source: "image://test/first-image.png"
}
Image {
id: image2
asynchronous: true
source: "image://test/first-image.png"
}
Timer {
interval: 50
running: true
repeat: false
onTriggered: {
image1.source = "image://test/second-image.png"
}
}
}

View File

@ -56,6 +56,7 @@
#include <QtGui/QPainter>
#include <QtGui/QImageReader>
#include <QQuickWindow>
#include <QQuickImageProvider>
#include "../../shared/util.h"
#include "../../shared/testhttpserver.h"
@ -102,6 +103,7 @@ private slots:
void sourceSize();
void progressAndStatusChanges();
void sourceSizeChanges();
void correctStatus();
private:
QQmlEngine engine;
@ -868,6 +870,55 @@ void tst_qquickimage::progressAndStatusChanges()
delete obj;
}
class TestQImageProvider : public QQuickImageProvider
{
public:
TestQImageProvider() : QQuickImageProvider(Image) {}
QImage requestImage(const QString &id, QSize *size, const QSize& requestedSize)
{
if (id == QLatin1String("first-image.png")) {
QTest::qWait(50);
int width = 100;
int height = 100;
QImage image(width, height, QImage::Format_RGB32);
image.fill(QColor("yellow").rgb());
if (size)
*size = QSize(width, height);
return image;
}
QTest::qWait(400);
int width = 100;
int height = 100;
QImage image(width, height, QImage::Format_RGB32);
image.fill(QColor("green").rgb());
if (size)
*size = QSize(width, height);
return image;
}
};
void tst_qquickimage::correctStatus()
{
QQmlEngine engine;
engine.addImageProvider(QLatin1String("test"), new TestQImageProvider());
QQmlComponent component(&engine, testFileUrl("correctStatus.qml"));
QObject *obj = component.create();
QVERIFY(obj);
QTest::qWait(200);
// at this point image1 should be attempting to load second-image.png,
// and should be in the loading state. Without a clear prior to that load,
// the status can mistakenly be in the ready state.
QCOMPARE(obj->property("status").toInt(), int(QQuickImage::Loading));
QTest::qWait(400);
delete obj;
}
QTEST_MAIN(tst_qquickimage)
#include "tst_qquickimage.moc"