Qt Quick ImageProvider (Bilder anzeigen in QML)



  • Hallo,
    In meinem aktuellen Projekt geht es darum sich bewegende Objekte aus einer Reihe von Bildern zu rechnen.
    Wir haben uns für eine GUI mit Qml entschieden und stehen jetzt vor dem Problem die Bilder in unserer GUI anzeigen zu lassen, besonders das Ergebnisbild macht Probleme.

    Für die ausgewählten Bilder, die ja bereits auf der Festplatte vorhanden sind müsste es ja möglich sein die URL von C++ nach QML zu übergeben und dort einfach auf zu rufen.

    Das Ergebnisbild wollten wir bisher in einem Ordner (relativ adressiert) speichern und diese relative Adresse dann in QML einfach wieder aufrufen. Ganz abgesehen davon, dass das keine schöne Lösung ist funktioniert sie auch nicht.
    Wenn ich das richtig verstanden habe wäre der richtige Weg über den Qt Quick imageprovider zu gehen.
    Hier verstehe ich allerdings nicht wie man diesen so implementiert, dass ich ihm einfach ein Qimage mitgeben kann.
    Das Beispiel von Qt hat mir in dieser Hinsicht leider auch gar nicht geholfen.

    LG.



  • Öhm wie denn nu. Wollt ihr in QML eine image file anzeigen oder ein QImage?

    Für letzteres gäbe es folgende möglichkeit: https://forum.qt.io/topic/69209/how-to-display-a-qpixmap-qimage-in-qml/3

    Für ersteres einfach den pfad angeben (Absolut oder relativ, wobei relativ zum verzeichnis in dem sich das qml file befindet in dem der QML Image type referenziert wird.
    https://doc.qt.io/qt-5/qml-qtquick-image.html#source-prop



  • Wir wollen beides machen.
    Einerseits bereits vorhandene Bilder einfach nur per URL darstellen, da hatten wir allerdings Probleme, dass das relative adressieren der Pfade nicht so geklappt hat (“../../ressourcen/resultPicture.jpg” ist doch der richtige Weg um 2 Pfade nach oben zu gehen und von da aus dann in dem Ressourcen Ordner das entsprechende Bild).

    Beim darstellen von QImages hatte ich mir bisher vor allem den Imageprovider angeschaut und bin dabei auf die oben genannten Probleme gestoßen. Den Container mit den Pixmaps werde ich mir auch nochmal anschauen vielleicht kommen wir damit ja besser klar.



  • Funktioniert es mit einer absoluten URL?
    Wenn nicht kann es sein dass ihr den jpeg support für QImage nicht inkludiert habt, falls ihr Qt selbst übersetzt habt.



  • Hier ein Beispiel bezüglich relativen pfad in Image.source property.
    Es wird das selbe image zwei mal geladen, jeweils mit relativen pfanden

    Directory structure:
    sub
    sub/MyItem.qml
    res
    res/test.jpg
    test.qml (main qml file)

    test.qml:

    import QtQuick 2.0
    import "sub"
    
    Rectangle
    {
        Image {
            source: "res/test.jpg"
        }
        MyItem
        {
            y: 20
        }
    }
    

    sub/MyItem.qml:

    import QtQuick 2.0
    
    Item {
        Image {
            source: "../res/test.jpg"
            width: 100
            height: 100
        }
    }
    


  • Ich habe das ganze heute nochmal probiert und mit dem adressieren immer noch Probleme.
    Ich bekomme immer die Fehlermeldung:
    “Qml Image: Cannot Open: qrc:/Desktop/Lake1.jpg”.
    Die Adresse habe ich sowohl manuell eingegeben, als auch das Bild über den Designer ausgewählt.

    Hast du diesen Fehler schonmal gesehen?
    Es kann ja nicht sein, dass ich nur Dateien anzeigen kann, welche ich als Ressourcen hinzugefügt habe.



  • Ah das ist eine wichtige information.
    Ihr ladet die qml dateien via Qt ressources. Denn dann beziehen sich pfad , welche kein "Protocol" angeben (z.b. qrc://, file://, http://) auf ein item innerhalb der Qt Ressources. Denn das source property ist vom typ url
    Um auf eine Datei im Dateisystem zu referenzieren muss die URL mit file:// beginnen.

    Wobei ich da nicht weis ob die URL dann relativ sein kann oder dann unbedingt absolut sein muss.



  • Ah, vielen Dank für den Hinweis die absolute Adressierung funktioniert so auf jeden Fall, relativ aber leider nicht.
    Kann ich die Qml Datei auch außerhalb der Ressourcen aufrufen? Welche vor oder Nachteile habe ich dadurch?



  • @leon676 sagte in Qt Quick ImageProvider (Bilder anzeigen in QML):

    Kann ich die Qml Datei auch außerhalb der Ressourcen aufrufen?

    Jupp so habe ich es auch in meinem obigen Beispiel gemacht. Die Dateien liegen so in einem Verzeichnis.
    Für den reinen qml test gibt es qmlscene. Bei dem man einfach das "root" qml file angibt beim Start.

    Welche vor oder Nachteile habe ich dadurch?

    Ein "Nachteil" ist der, dass dadurch der Nutzer die qml Dateien sehen und kopieren/verändern kann. Wobei das nur ein Nachteil ist falls diese Möglichkeit unbedingt verhindert werden sollte.
    Ein weiterer Nachteil ist des etwas aufwändigere "Packaging" der kompletten Programms, da nun auch die qml files zusätzlich kopiert werden müssen.

    Der große Vorteil auf Entwicklerseite ist der, dass man recht einfach Änderungen an den QML files testen kann ohne das Programm neu übersetzen zu müssen.

    Aber was spricht gegen eine absolute Adressierung? Ich vermute mal es gibt noch eine Logik dahinter, welche dem UI die anzuzeigenden Image files liefert. Die sollte doch recht einfach anpassbar sein, damit diese absolute Urls liefert.



  • Vielen Dank für deine Hilfe!
    Das Problem mit der Adressierung konnte ich jetzt komplett lösen und habe mir damit auch einen kleinen Workaround für das Problem mit dem übergeben der Bilder gebastelt.

    Das mit dem Container oder dem ImageProvider steht definitiv noch auf meiner FIXME Liste, bin aber erstmal froh dank deiner Hilfe eine funktionierende Lösung zu haben.
    Vielen Dank auch für die Erläuterungen!

    LG.