c++ - Override QQuickImageProvider requestImage() -


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)             }         }     } }