C++ [QT] ImageProvider

Ins4ne

Ensign
Registriert
Jan. 2009
Beiträge
223
Hey Leute,

ich versuche mich gerade neu in QT 5.2 (5.4 habe ich noch nicht für den raspi gebaut) und QML und habe das Problem das ich es nicht schaffe einen gültigen ImageProvider herzustellen. Das ganze läuft auf einem RaspberryPi und wird Cross-kompiliert.

In der main.qml habe ich ein Image erstellt und als source: "image://lastimage/ID" wie ich es auch in den Tutorials gelesen habe.

main.qml
Code:
import QtQuick 2.2
import QtQuick.Controls 1.1

ApplicationWindow {
(...)
    Image {
        id: mainImage
        x: 0
        y: 0
        width: mainwindow.width
        height: this.width * 1.5
        source: "image://lastimage/bild"
    }
(...)
}

Als nächstes habe ich einen Image Provider erstellt:
imageprovider.cpp
Code:
#include "imageprovider.h"

#include <QQuickImageProvider>
#include <QImageReader>
#include <QTextStream>


ImageProvider::ImageProvider() : QQuickImageProvider( QQuickImageProvider::Image)
{

}

QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize)
{
    QImageReader reader;

    QTextStream() << id;

    reader.setFileName("testbild.jpg");

    QTextStream() << reader.canRead();
    return reader.read();
}

imageprovider.h
Code:
#ifndef IMAGEPROVIDER_H
#define IMAGEPROVIDER_H

#include <QQuickImageProvider>

class ImageProvider : public QQuickImageProvider
{
public:
    ImageProvider();

    // Sobald ich diese Zeile mit aufnehme bekomme ich folgede fehlermeldung beim kompilieren: 
    // undefined reference to 'vtable for ImageProvider'
    //QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize);
};

#endif // IMAGEPROVIDER_H

Und zuletzt habe ich in der main den ImageProvider der Engine hinzugefügt:
main.cpp
Code:
#include <QApplication>
#include <QQmlApplicationEngine>

#include "imageprovider.h"
#include "mainprocess.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    app.setOverrideCursor(Qt::BlankCursor);


    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    engine.addImageProvider(QString("lastimage"), new ImageProvider);

    // MainProcess starten
    MainProcess mainProcess;

    return app.exec();
}

Das ganze lässt sich auch erfolgreich bauen, aber beim Ausführen (Debuggen) kommt die Meldung:
Code:
qrc:/main.qml:12:5: QML Image: Invalid image provider: image://lastimage/bild

Habt ihr eine Idee was ich falsch mache? Ziel des ganzen ist im C++ Programm zu bestimmen, was für ein Bild die QML anzeigen soll. Habe gedacht das ich dann über Signals und Slots ein neuladen des bildes anfordern kann und so durch bestimmte Bilder durchwechsel.

Ich hoffe ihr könnt mir helfen.

Danke

Ins4ne
 
Die Methode ImageProvider::requestImage(..) hat nur eine Definition, wird allerdings nirgendwo tatsächlich ausformuliert. In der imageprovider.h hast du lediglich eine requestImage(..). Das müsste ImageProvider::requestImage(..) heißen.
Keine Ahnung, ob das das Problem bereits löst, aber das war das, was mir spontan aufgefallen ist.
 
Danke für die Antwort,

manchmal übersieht man sowas :/ jetzt passt das mit der definition im headerfile.

Leider wirft es beim Ausführen immer noch die Meldung
Code:
qrc:/main.qml:12:5: QML Image: Invalid image provider: image://lastimage/bild

aus.

Hat noch jemand eine Idee?
Ergänzung ()

Also ich denke, dass ich das Problem gefunden habe.

Falls jemand vor dem gleichen Problem steht:
Code:
    QQmlApplicationEngine engine;
    engine.addImageProvider(QString("lastimage"), new ImageProvider);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

Der ImageProvider muss vor dem laden des QML-Files zugewiesen werden.
 
Zuletzt bearbeitet:
Zurück
Oben