i using qquickimageprovider , have taken class object(pagebuffer) in requestimage function:
class imageprovider : public qquickimageprovider{ public: explicit imageprovider(); virtual qimage requestimage(int id, qsize *size, const qsize& requestedsize,pagebuffer p); ~imageprovider(); };
i want set qimage of imageprovider using variable saved in pagebuffer object , use id index this:
qimage imageprovider:: requestimage(int id, qsize *size, const qsize &requestedsize,pagebuffer p) { return p.imagelist[id]; }
here qml file want call image provider:
image{ x: 4 y: 4 height : imagerec.height visible: true width : imagerec.width anchors.fill: imagerec source:fileurl text{ id:txt x: 0 y: 71 text:"sketch"+(index+1) horizontalalignment: txt.alignhcenter font.family: "tahoma" color:"#ffffff" } mousearea { anchors.rightmargin: -59 anchors.bottommargin: -39 anchors.fill: parent onclicked: { p.index=index; p.image=mod.get(index).fileurl main.source="image://image/"+index } } }
ok guys, can begin this example qt. below piece of code demonstrates using image provider load random images internet, although think trivial.
myimageprovider.h
class myimageprovider : public qquickimageprovider { public: myimageprovider(imagetype type, flags flags = 0); ~myimageprovider(); qimage requestimage(const qstring & id, qsize * size, const qsize & requestedsize); protected: qnetworkaccessmanager *manager; };
myimageprovider.cpp
myimageprovider::myimageprovider(imagetype type, flags flags) : qquickimageprovider(type,flags) { manager = new qnetworkaccessmanager; } myimageprovider::~myimageprovider() { delete manager; } qimage myimageprovider::requestimage(const qstring &id, qsize *size, const qsize &requestedsize) { qurl url("http://lorempixel.com/" + id); qnetworkreply* reply = manager->get(qnetworkrequest(url)); qeventloop eventloop; qobject::connect(reply, signal(finished()), &eventloop, slot(quit())); eventloop.exec(); if (reply->error() != qnetworkreply::noerror) return qimage(); qimage image = qimage::fromdata(reply->readall()); size->setwidth(image.width()); size->setheight(image.height()); return image; }
registering our image provider in main.cpp:
int main(int argc, char *argv[]) { qguiapplication app(argc, argv); qqmlapplicationengine engine; myimageprovider *imageprovider = new myimageprovider(qqmlimageproviderbase::image); engine.addimageprovider("myprovider",imageprovider); engine.load(qurl(qstringliteral("qrc:/main.qml"))); return app.exec(); }
and using provider in qml:
window { visible: true width: 800 height: 600 image { id: img anchors.centerin: parent source: "image://myprovider/500/500/" onstatuschanged: { if(status == image.ready) indicator.running = false; } busyindicator { id: indicator anchors.centerin: parent running: false } mousearea { anchors.fill: parent onclicked: { indicator.running = true; img.source = "image://myprovider/500/500/?seed=" + math.random(1000) } } } }