Unsolved Dateieigenschaften einer Datei einlesen (QT Quick)
-
Hallo,
ich stehe vor folgendem Problem aktuell. Ich lese ein Verzeichnis ein. Erzeuge aus dem Pfad ein FolderListModel mit dem ich einen GridView mit beschrifteten Icons befülle.
Jetzt wollte ich im nächsten Schritt ein "Infofenster" mit den Eigenschaften des angeklickten Elements darstellen.
Testweise habe ich auf den "onClicked" Handler der MouseArea ein Zuweisung der Eigenschaften die mir das FolderListModel liefert an einzelne Textelemente versucht.
Das funktioniert zwar hat aber das Problem das ich jedem Element des Gridview alle vom FolderListModel möglichen Eigenschaften per property mitgeben muss damit es funktioniert und die möglichen Eigenschaften sehr begrenzt sind.Mehr als Dateiname, Suffix, Pfad(e), Größe, und Datum erhalte ich auf dem Wege nicht. (Interessant wäre zum Beispiel die Auflösung eines Bildes oder die Dauer eines Videos). Desweiteren habe ich das Problem das ich die Darstellung nicht in eine Funktion auslagern konnte da ich Probleme hab das jeweilig angeclickte Element korrekt zu übergeben.
Da ich den Pfad zu der Datei die das Symbol darstellt aber sauber bekomme (damit habe ich das öffnen der Dateien per Player / Imageviewer realisiert) war ich am überlegen ob man nicht das auslesen der Eigenschaften einer Datei in eine Funktion auslagern könnte der ich nur den Pfad der zu untersuchenden Datei übergebe, dazu konnte ich in der Doku aber leider nichts finden wie ich Eigenschaften von Dateien auslesen kann.
Hat vielleicht jemand einen Tipp für mich wo ich da ansetzen könnte?
Gruß
Marco
-
hi @Throndar
Von dem was ich aus dem Stegreif weis glaub ich nicht das es hier eine fertige QML Lösung für dich gibt.
Ich nehme an dass das
FolderListModel
im Backend auch nur auf die Informationen Zugriff hat die QFileInfo ausliest.So etwas wie Bildauflösung oder Videolänge ist, meines Wissens nach, nicht Teil der Standardinformationen.
Aber an deiner Stelle würde ich hier nun eine cpp-Classe erstellen die hier eingreift.
Die Klasse stellt dann ein Listmodel bereit, welches in QML zur Verfügung gestellt wird.
Dann kann man hergehen und und auf Dateiformat achten und im Falle von z.B Bildern oder Videos die entsprechenden Dateien in ein QImage / QVideo laden und daraus die Informationen beziehen.
In der Klasse selber kann man entsprechende Properties anlegen die dann befüllt werden.Aus performance Gründen würde ich diese genauen Informationsausgabe aber nur mit dem derzeit ausgewählten Item in der Liste machen.
Grüße
-
hi @J.Hilk
danke für den Hinweis mit der Klasse. Ich werde versuchen es auf dem Wege umzusetzen.
Als wenig schöne Version hatte ich gerade (überraschenderweise erfolgreich) versucht ein invisible Image zu deklarieren. Beim onClick auf ein Item des Gridview habe ich geprüft ob das Suffix einem Bild entspricht, wenn ja eine Funktion aufgerufen die den Pfad des Bildes an das unsichtbare Image übergeben hat. Somit wurde immer nur ein Bild gleichzeitig ausgewertet und vom Image anschließend konnte ich sourceSize.width und sourceSize.height zurückgeben lassen damit habe mir auf dem Wege die Bildauflösung gesucht.
Ich glaube die Version in separater Klasse ist da erheblich eleganter und weit weniger Flickschusterei als mein, sagen wir mal freundlich "kreativer" Ansatz.
Eine Frage habe ich aber noch, bei ListModel hatte ich bisher nur die Ausführung in QML gesehen in der Doku (https://doc-snapshots.qt.io/qt5-5.9/qml-qtqml-models-listmodel.html) ich denke mal du meinst da aber etwas anderes oder irre ich mich da?
Auf jeden Fall Danke ich dir vielmals für deine Hilfe
Marco
-
hey @Throndar
sorry für die späte Antwort, ich versuche immer übers Wochenende mich vom Internet abzukapseln, klappt leider nicht immer aber dieses WE hatte es.Zu deiner Frage,
es gibt eine Reihe von Möglichkeiten wie man das Cpp-Backend realisieren kann.
Der offizielle Weg ist wohl dieser:
http://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.htmlIm prinzip gilt, Jede QObject-Liste kann als model für QML Listview genutzt werden, aber wenn mans
richtig
machen will, gilt esQAbstractItemModel
als subclasse zu verwenden :)Hoffe das hilft dir.
Grüße
-
Hallo @J.Hilk
kein Problem wegen dem Wochenende, ich bin ja froh das mir jemand hilft :)
Ich habe gerade deinen Link kurz durchgelesen bevor ich anfange ihn gleich nochmal in Detail durchzuarbeiten dabei ist mir aber schon eine Frage aufgefallen. Wie wäre der richtige Weg wenn das Projekt größer wird.
Würde ich eine C++ Klasse anlegen in der alle Klassen nacheinander aufgeführt sind (hab ich in mehreren Beispielen bisher so gesehen das da einfach hintereinander die Klassen geschrieben wurden) oder würde ich für jede Klasse eine eigene C++ Klasse erstellen? Ich könnte mir vorstellen das das zwar viele Dateien ergibt aber am Ende übersichtlicher wird.
In dem Beispiel von deinem Link ist ja Klasse "animal" und QAbstractModel "AnimalModel" in der gleichen Datei definiert weshalb ich mich gefragt habe wie es richtig gemacht wird da ich versuche es mir möglichst richtig beizubringen und schlechten Stil zu vermeiden.Und eine (bzw. eher zwei) letzte Frage, wenn ich eine Klasse für ein QObject meinem Projekt hinzufüge, gehe ich ja über Hinzufügen -> C++ und wähle dann "Klasse" -> Basisklasse "QObject" und binde das QQuickItem (Qt Quick 2) Item ein. Gebe einen Klassennamen ein und schließe das ganze ab. Da es leider keine Beispieldateien im Artikel gibt frage ich mich ob beim QAbstractItemModel Subclass wo keine entsprechende Auswahl vorhanden ist, dass dann über "benutzerdefiniert" erfolgt und ob da da noch weitere Parameter setzen müsste?
Und als allerletztes war mir bei QT Creator aufgefallen wenn ich eine Klasse erstelle mir unter Modellierung ein "Qmodel" angeboten wird, da dort aber ein Drag & Drop Feld mit Klassen / Komponenten / usw erzeugt wird wollte ich wissen ob das rein für Dokumentationszwecke gedacht ist oder ob dort ggfls. Klassen bezeichnet`/ angelegt werden müssen?
Der Post ist jetzt leider vieel länger geworden als ursprünglich geplant Ich hoffe die Fragen sind für einen Profi nicht allzu blöd und bedanke mich im Voraus für die Mühe sich hier mit mir gegeben wird.
Danke
Marco
-
Hi Marco,
@Throndar said in Dateieigenschaften einer Datei einlesen (QT Quick):Würde ich eine C++ Klasse anlegen in der alle Klassen nacheinander aufgeführt sind (hab ich in mehreren Beispielen bisher so gesehen das da einfach hintereinander die Klassen geschrieben wurden) oder würde ich für jede Klasse eine eigene C++ Klasse erstellen? Ich könnte mir vorstellen das das zwar viele Dateien ergibt aber am Ende übersichtlicher wird.
In dem Beispiel von deinem Link ist ja Klasse "animal" und QAbstractModel "AnimalModel" in der gleichen Datei definiert weshalb ich mich gefragt habe wie es richtig gemacht wird da ich versuche es mir möglichst richtig beizubringen und schlechten Stil zu vermeiden.Ich würde sagen das hängt einfach nur sehr stark von deinem Programmierstil ab, bzw. dran wie du es gelernt hast.
In dem Beispiel ist Animal eigentlich nur ein struct, das als Klasse ausgeschrieben ist. D.h sie ist sehr einfach gestrickt und dient als Container für 2 Werte.Prinzipiell, kannst du alles in eine Klasse bzw sogar alles in ein header file schreiben. Das geht, ganz gut, wenn die Zusatzklassen nur wenige Zeilen betragen und du nicht vor hast diese wo anders noch einmal neu zu verwenden.
Für alles andere würde ich empfehlen diese in ihre eigenen Dateien auszulagern, der Übersichthalber.
Und eine (bzw. eher zwei) letzte Frage, wenn ich eine Klasse für ein QObject meinem Projekt hinzufüge, gehe ich ja über Hinzufügen -> C++ und wähle dann "Klasse" -> Basisklasse "QObject" und binde das QQuickItem (Qt Quick 2) Item ein. Gebe einen Klassennamen ein und schließe das ganze ab. Da es leider keine Beispieldateien im Artikel gibt frage ich mich ob beim QAbstractItemModel Subclass wo keine entsprechende Auswahl vorhanden ist, dass dann über "benutzerdefiniert" erfolgt und ob da da noch weitere Parameter setzen müsste?
QtCreater bietet diese Templates an, um dir die Arbeit etwas zu erleichtern. Alles was gemacht wird, sind Declaration Guards und sehr eine basic class definition - name, Klassen{}, constructor etc . Es hält dich nichts davon ab, nur eine standart cpp klasse zu erstellen und alles andere per Hand nachzutragen. Das ist der Weg den ich normalerweise gehe, dann weis ich wenigstens, genau, warum was in meiner Klasse steht :)
Und als allerletztes war mir bei QT Creator aufgefallen wenn ich eine Klasse erstelle mir unter Modellierung ein "Qmodel" angeboten wird, da dort aber ein Drag & Drop Feld mit Klassen / Komponenten / usw erzeugt wird wollte ich wissen ob das rein für Dokumentationszwecke gedacht ist oder ob dort ggfls. Klassen bezeichnet`/ angelegt werden müssen?
Sorry, damit habe ich keine Erfahrung, wie gesagt ich lasse normalerweise QtCreator nur eine basic cpp Klasse erstellen und erweitere diese dann je nach bedarf.
Der Post ist jetzt leider vieel länger geworden als ursprünglich geplant Ich hoffe die Fragen sind für einen Profi nicht allzu blöd und bedanke mich im Voraus für die Mühe sich hier mit mir gegeben wird.
:-) Ein Profi bin ich nicht wirklich, da haben andere hier deutlich mehr Erfahrung, aber ich helfe gerne, wenn ich kann.
Grüße