title: Connecting QQuickImageProvider
body: <p>I have to connect a QQuickImageProvider with a class to pass an image that the image provider must return, but I am not finding a way to do that.</p>
  
  <p>I have a class called provedorImagem.cpp with a virtual requestImage function implemented and I have also a class called processaImagem.cpp that is the class to perform modification at the image.</p>
  
  <p>The provedorImagem class is passed to engine as a provider: engine.addImageProvider("provedor", provedorImg) in main.cpp</p>
  
  <p>What I need is a way to connect a slot in the provider in main.cpp with a signal in processaImagem.cpp. Doing that the processaImagem.cpp can send the image I must return to Qml to provedorImagem.cpp and send it back to Qml.</p>
  
  <p>Could someone help me?</p>
  
  <p>Code below</p>
  
  <p>main.cpp</p>
  
  <pre><code>#include &lt;QGuiApplication&gt;
  #include &lt;QQmlApplicationEngine&gt;
  
  #include &lt;QtQml&gt;
  
  #include "processaimagem.h"
  #include "provedorimagem.h"
  
  int main(int argc, char *argv[])
  {
      QGuiApplication app(argc, argv);
  
      qmlRegisterType&lt;processaImagem&gt;("ProcessaImagemQml", 1, 0, "ProcessaImagem");
  
      QQmlApplicationEngine engine;
  
      provedorImagem *provedorImg = new provedorImagem;
  
      //------------  I have to create a connection here between the provider slot and a signal in processaImagem with the image to provide  -----------------
  
      engine.addImageProvider("provedor", provedorImg);
  
      engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
  
      return app.exec();
  }
  </code></pre>
  
  <p>processaImagem.h</p>
  
  <pre><code>#ifndef PROCESSAIMAGEM_H
  #define PROCESSAIMAGEM_H
  
  #include &lt;QObject&gt;
  #include &lt;QImage&gt;
  #include &lt;QQmlEngine&gt;
  #include &lt;QQmlContext&gt;
  #include &lt;QQuickImageProvider&gt;
  
  #include "provedorimagem.h"
  
  class processaImagem : public QObject
  {
      Q_OBJECT
  
  public slots:
      QString recebeImagem(const QString &amp;caminho);
  
  public:
      processaImagem(QObject *parent = 0);
  
      QImage carregaImagem(const QString &amp;caminho);
  
  signals:
      void enviaImagem(QImage);
  };
  
  #endif // PROCESSAIMAGEM_H
  </code></pre>
  
  <p>processaImagem.cpp</p>
  
  <pre><code>#include "processaimagem.h"
  
  #include &lt;QDebug&gt;
  
  processaImagem::processaImagem(QObject *parent)
  {
  
  }
  
  QString processaImagem::recebeImagem(const QString &amp;caminho)
  {
      QImage imagem = this-&gt;carregaImagem(caminho);
  
      QString caminhoRetorno;
  
      if(imagem.isNull())
      {
          qDebug() &lt;&lt; "Erro ao receber a imagem";
      }
      else
      {
          qDebug() &lt;&lt; "Imagem recebida";
          caminhoRetorno = "image://provedor/imagemEditada";
      }
  
      return caminhoRetorno;
  }
  
  QImage processaImagem::carregaImagem(const QString &amp;caminho)
  {
      QUrl caminhoImagem(caminho);
      QQmlEngine *engine = QQmlEngine::contextForObject(this)-&gt;engine();
      QQmlImageProviderBase *imageProviderBase = engine-&gt;imageProvider(caminhoImagem.host());
      QQuickImageProvider *imageProvider = static_cast&lt;QQuickImageProvider*&gt;(imageProviderBase);
  
      QSize imageSize;
      QString imageId = caminhoImagem.path().remove(0, 1);
      QImage imagem = imageProvider-&gt;requestImage(imageId, &amp;imageSize, imageSize);
  
      if(imagem.isNull())
      {
          qDebug() &lt;&lt; "Erro ao carregar a imagem";
          imagem = QImage();
      }
      else
      {
          qDebug() &lt;&lt; "Imagem carregada";
      }
  
      return imagem;
  }
  </code></pre>
  
  <p>provedorimagem.h</p>
  
  <pre><code>#ifndef PROVEDORIMAGEM_H
  #define PROVEDORIMAGEM_H
  
  #include &lt;QImage&gt;
  #include &lt;QQuickImageProvider&gt;
  
  class provedorImagem : public QQuickImageProvider
  {
  public:
      provedorImagem();
  
      QImage requestImage(const QString &amp;id, QSize *size, const QSize &amp;requestedSize);
  
      void carregaImagem();
  
  public slots:
      void carregaImagem(QImage imagemRecebida);
  
  private:
      QImage imagem;
  };
  
  #endif // PROVEDORIMAGEM_H
  </code></pre>
  
  <p>provedorimagem.cpp</p>
  
  <pre><code>#include "provedorimagem.h"
  
  #include &lt;QDebug&gt;
  
  provedorImagem::provedorImagem() : QQuickImageProvider(QQuickImageProvider::Image)
  {
  
  }
  
  QImage provedorImagem::requestImage(const QString &amp;id, QSize *size, const QSize &amp;requestedSize)
  {
      if(imagem.isNull())
      {
          qDebug() &lt;&lt; "Erro ao prover a imagem";
      }
      else
      {
          qDebug() &lt;&lt; "Imagem provida";
      }
  
      return imagem;
  }
  
  void provedorImagem::carregaImagem(QImage imagemRecebida)
  {
      imagem = imagemRecebida;
  }
  </code></pre>