How to show QImage from http url?
-
wrote on 19 Jul 2011, 08:04 last edited by
[quote author="Chuck Gao" date="1311058507"]Hi jkosonen, you want to show your images with QML?[/quote]
Yes :)
-
wrote on 19 Jul 2011, 08:12 last edited by
If so, i think the key point is the file path(local or internet). QML Image element's source can be a url, so you just need to get the file path. The element itself will take care of the http part.
-
wrote on 19 Jul 2011, 08:22 last edited by
[quote author="Chuck Gao" date="1311063146"]If so, i think the key point is the file path(local or internet). QML Image element's source can be a url, so you just need to get the file path. The element itself will take care of the http part.[/quote]
Yes, I know. but I don't want to download it from the internet everytime, but make a local copy and then take it from there if exists.
-
wrote on 19 Jul 2011, 08:32 last edited by
You want cache the images yourself ? I mean, store them into the cache and get them from the cache. I'm not sure if the QML Image element use caching when load url image. But you can try QNetworkDiskCache. I found this in the document: "Images are cached and shared internally, so if several Image elements have the same source, only one copy of the image will be loaded". Let's look into the source code. :-)
-
wrote on 19 Jul 2011, 08:38 last edited by
Yes, I would like to cache by myself :) I don't think that the QML caches those automatically since it always takes so long to get the images to the screen.
Maybe need to investigate that QNetworkDiscCache, but I wouldn't mind if someone could give me a solution to problem I had in the main question :)
-
wrote on 19 Jul 2011, 08:56 last edited by
I have a look at the source code, and QML will cache those images for you, with
@
QDeclarativeImageBase::load()
{
...
QDeclarativePixmap::load(QDeclarativeEngine *engine, const QUrl &url;, const QSize &requestSize;, bool async)
{
if (d) { d->release(); d = 0; }QDeclarativePixmapKey key = { &url;, &requestSize; }; QDeclarativePixmapStore *store = pixmapStore(); QHash<QDeclarativePixmapKey, QDeclarativePixmapData *>::Iterator iter = store->m_cache.find(key); if (iter == store->m_cache.end()) { if (async) { // pixmaps can only be loaded synchronously if (url.scheme() == QLatin1String("image") && QDeclarativeEnginePrivate::get(engine)->getImageProviderType(url) == QDeclarativeImageProvider::Pixmap) { async = false; } } if (!async) { bool ok = false; d = createPixmapDataSync(engine, url, requestSize, &ok;); if (ok) { d->addToCache(); return; } if (d) // loadable, but encountered error while loading return; } if (!engine) return; QDeclarativePixmapReader *reader = QDeclarativePixmapReader::instance(engine); d = new QDeclarativePixmapData(url, requestSize); d->addToCache(); d->reply = reader->getImage(d); } else { d = *iter; d->addref(); }
}
.....
}
@ -
wrote on 19 Jul 2011, 08:58 last edited by
Then it takes awful lot of time to show the image if it already comes from cache...
-
wrote on 19 Jul 2011, 08:59 last edited by
[quote author="jkosonen" date="1311064731"]Yes, I would like to cache by myself :) I don't think that the QML caches those automatically since it always takes so long to get the images to the screen.
Maybe need to investigate that QNetworkDiscCache, but I wouldn't mind if someone could give me a solution to problem I had in the main question :)[/quote]
QNetworkDiskCache is the same way I've suggested. It is really not hard (maybe a 5 or 10 lines of code)
-
wrote on 19 Jul 2011, 09:03 last edited by
[quote author="Denis Kormalev" date="1311065955"][quote author="jkosonen" date="1311064731"]Yes, I would like to cache by myself :) I don't think that the QML caches those automatically since it always takes so long to get the images to the screen.
Maybe need to investigate that QNetworkDiscCache, but I wouldn't mind if someone could give me a solution to problem I had in the main question :)[/quote]
QNetworkDiskCache is the same way I've suggested. It is really not hard (maybe a 5 or 10 lines of code)[/quote]
Can you point me to any site with example, with QML?
-
wrote on 19 Jul 2011, 09:10 last edited by
"example about QDeclarativeNetworkAccessManagerFactory":http://doc.qt.nokia.com/4.7/declarative-cppextensions-networkaccessmanagerfactory.html
"QNetworkDiskCache":http://doc.qt.nokia.com/4.7/qnetworkdiskcache.html (there is an example of how to use it with QNAM) -
wrote on 19 Jul 2011, 09:17 last edited by
[quote author="Denis Kormalev" date="1311066630"]"example about QDeclarativeNetworkAccessManagerFactory":http://doc.qt.nokia.com/4.7/declarative-cppextensions-networkaccessmanagerfactory.html
"QNetworkDiskCache":http://doc.qt.nokia.com/4.7/qnetworkdiskcache.html (there is an example of how to use it with QNAM)[/quote]Thanks, will try that!
but there is this:
When sending requests, to control the preference of when to use the cache and when to use the network, consider the following:
@ // do a normal request (preferred from network, as this is the default)
QNetworkRequest request(QUrl(QString("http://qt.nokia.com")));
manager->get(request);// do a request preferred from cache
QNetworkRequest request2(QUrl(QString("http://qt.nokia.com")));
request2.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache);
manager->get(request2);@How do I say in QML to prfer cache?
-
wrote on 19 Jul 2011, 09:19 last edited by
jkosonen, it will prefer a cache in most part of cases (if we are talking about images)
-
wrote on 19 Jul 2011, 09:22 last edited by
[quote author="Denis Kormalev" date="1311067186"]jkosonen, it will prefer a cache in most part of cases (if we are talking about images)[/quote]
OK, but how to say then not to use cache, or clear cache?
Cache isn't always preferred, would be nice to know when it is used and when it's not. -
wrote on 19 Jul 2011, 09:24 last edited by
jkosonen, clearing cache is possbile with simple removing all contents of cache dir. I'm not aware of any other ways.
-
wrote on 20 Jul 2011, 02:10 last edited by
You can try Qt 4.8, it has a better image caching for QML. Hope it will work for you :D
-
wrote on 7 Aug 2011, 07:08 last edited by
Can anyone help with the question in the first post, how that could be done?
-
wrote on 7 Aug 2011, 11:44 last edited by
[quote author="jkosonen" date="1312700928"]Can anyone help with the question in the first post, how that could be done?[/quote]
By using [[Doc:QNetworkAccessManager]] - there are numerous examples out there (even in this forums :-) ) that show you the basic path.
-
wrote on 7 Aug 2011, 14:48 last edited by
Don't think so that there is... and what a useless post..
[quote author="Volker" date="1312717450"]
[quote author="jkosonen" date="1312700928"]Can anyone help with the question in the first post, how that could be done?[/quote]By using [[Doc:QNetworkAccessManager]] - there are numerous examples out there (even in this forums :-) ) that show you the basic path.[/quote]
-
wrote on 7 Aug 2011, 14:58 last edited by
So another useless post with another "link":http://developer.qt.nokia.com/wiki/Download_Data_from_URL, maybe of help this time.
I'm so awfully sorry to have put you on the wrong track. Of course it's not in the forums, but in the wiki. Silly me.
-
wrote on 7 Aug 2011, 15:25 last edited by
[quote author="Volker" date="1312729123"]So another useless post with another "link":http://developer.qt.nokia.com/wiki/Download_Data_from_URL, maybe of help this time.
I'm so awfully sorry to have put you on the wrong track. Of course it's not in the forums, but in the wiki. Silly me.[/quote]
That still doesn't really help in the original guestion, how I can return the Image trough slot..