Quantcast
Channel: Qt DevNet forums: Qt Quick 1283365070**
Viewing all articles
Browse latest Browse all 4972

[Solved] Send QImage from C++ to QML via QQuickImageProvider or using a signal

$
0
0
Thanks for your suggestions guys. I had thought about a signal then a getImage via a provider, but wasn’t clear how to refresh with a new image for the same id. That link suggested how to overcome that, but then I realized I needed a frame number as the id and everything would then work. And it does! The scene graph API is an interesting idea but a bit out of my comfort zone at the moment so that was my fallback which I didn’t need in the end. This is what I ended up with, it seems quite neat and compact really. Good old Qt. main.cpp #include <QtGui/QGuiApplication> #include <QQmlContext> #include <QTimer> #include "qtquick2applicationviewer.h" #include "NwImageProvider.h"   int main(int argc, char *argv[]) {     QGuiApplication app(argc, argv);     QTimer timer;     NwImageProvider *imageProvider = new NwImageProvider;     QtQuick2ApplicationViewer viewer;       viewer.rootContext()->engine()->addImageProvider(QLatin1String("NwImageProvider"), imageProvider);     viewer.rootContext()->setContextProperty("NwImageProvider", imageProvider);     viewer.setMainQmlFile(QStringLiteral("qml/ImageToQml/main.qml"));     viewer.showExpanded();       QObject::connect(&timer, SIGNAL(timeout()), imageProvider, SLOT(slotNewFrameReady()));     timer.setInterval(1000);     timer.setSingleShot(false);     timer.start();       return app.exec(); } main.qml import QtQuick 2.1 import QtQuick.Controls 1.0   Rectangle {     width: 360     height: 360     property bool isRedTop: false     property int currentFrameNumber: 0       Column {         anchors.centerIn: parent         Image { source: "image://NwImageProvider/" + currentFrameNumber}         Image { source: "image://NwImageProvider/" + (currentFrameNumber + 1)}     }       Connections {         target: NwImageProvider         onSignalNewFrameReady: {             console.log("onSignalNewFrameReady", frameNumber);             currentFrameNumber = frameNumber;         }     } } NwImageProvider.h #include <QObject> #include <QQuickImageProvider>   class NwImageProvider : public QObject, public QQuickImageProvider {     Q_OBJECT public:     NwImageProvider();     QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize);   public slots:     void slotNewFrameReady();   signals:     Q_SIGNAL void signalNewFrameReady(int frameNumber);   }; NwImageProvider.cpp #include "NwImageProvider.h"   NwImageProvider::NwImageProvider()     : QQuickImageProvider(QQmlImageProviderBase::Image) { }   QImage NwImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) {     int width = 100;     int height = 50;     int requestNumber;     QString strId = id;     bool bIsOk;       this->blockSignals(true);   // To allow debugging       requestNumber = strId.toInt(&bIsOk);     if (bIsOk)     {         switch (requestNumber % 4)         {         case 0: strId = "yellow"; break;         case 1: strId = "red"; break;         case 2: strId = "green"; break;         case 3: strId = "blue"; break;         default: strId = "black"; break;         }     }     if (size)         *size = QSize(width, height);     QImage image(requestedSize.width() > 0 ? requestedSize.width() : width,                    requestedSize.height() > 0 ? requestedSize.height() : height, QImage::Format_RGB32);     image.fill(QColor(strId).rgba());       this->blockSignals(false);       return image; }   void NwImageProvider::slotNewFrameReady() {     static int nextFrameNumber = 0;     emit signalNewFrameReady(nextFrameNumber++); }

Viewing all articles
Browse latest Browse all 4972

Latest Images

Trending Articles



Latest Images