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++);
}
↧










