Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Wie Einstieg in QAbstractItemModel finden?



  • Hallo,

    ich beschäftige mich seit ein paar Wochen mit QT und bin gerade irgendwie vor eine Wand gelaufen. Ich versuche im QT Quick einen kleinen Filebrowser / Fileexplorer zu bauen und dafür mit dem Treeview eine Baumansicht zu erstellen die das Laufwerk einliest.

    Für den Treeview benötige ich als "model" wie ich in der Dokumentation gefunden habe, aus dem QAbstractItemModel ein FileSystemModel wenn ich es richtig verstanden habe, nur hänge ich an der Stelle komplett.

    Ich hatte in den Beispielen das "Qt Quick Controls - File System Browser" Beispiel gefunden was aber leider komplett ohne Erläuterung ist und 1:1 zwar läuft, beim Versuch das ganze nachzubauen (ohne die Buttons) bin ich aber vollständig gescheitert so das einen schönen aber leider leeren Filetree bekommen habe.

    Kennt jemand vielleicht eine Quelle / Website die das Thema ein wenig beleuchtet oder allgemein erklärt wie ich die Verzeichnisstruktur eines Laufwerks in ein auswertbares Model für den Treeview umwandeln kann in QT Quick?

    Mit bestem Dank im Vorraus

    Marco

    PS. Als QT Widgets habe ich einige Tutorials gefunden die auch klappen, ich wollte das ganze aber in QT Quick umsetzen da ich bisher in QT Quick schon ein wenig Erfahrung gesammelt habe und in der Richtung weiter machen wollte.


  • Moderators

    @Throndar said in Wie Einstieg in QAbstractItemModel finden?:

    PS. Als QT Widgets habe ich einige Tutorials gefunden die auch klappen, ich wollte das ganze aber in QT Quick umsetzen da ich bisher in QT Quick schon ein wenig Erfahrung gesammelt habe und in der Richtung weiter machen wollte.

    QAbstractItemModel Instanzen geschrieben in C++ können auch in QML verwendet werden.



  • Hallo raven-worx,

    erstmal vielen Dank für die Antwort. Die QAbstractItemModel Instanzen sehen schon einmal sehr gut aus. In dem Beispiel auf der Seite mit den Tieren wird das ganze ja statisch eingegeben in C++ wenn ich das richtig verstanden habe.

    In meinem Widget was ich mir mit Tutorials aus dem Netz gebaut habe hatte ich in der Klasse "Dialog" in der dialog.h die beiden QFileSystemModels *dirmodel und *filemodel unter private definiert.

    In der Dialog.cpp hatte ich das dann vom System eingelesen (einmal die Ordner (dirmodel) und einmal die Dateien (filemodel):

        QString sPath = "";
        dirmodel = new QFileSystemModel(this);
        dirmodel->setFilter(QDir::NoDotAndDotDot | QDir::AllDirs);
        dirmodel->setRootPath(sPath);
    
        ui->treeView->setModel(dirmodel);
    
        filemodel = new QFileSystemModel(this);
        filemodel->setFilter(QDir::Files);
        filemodel->setRootPath(sPath);
    
        ui->listView->setModel(filemodel);
    

    Was sich mir jetzt irgendwie nicht erschließt wie ich im QTQuick an die Daten / das Model ran komme bzw. wo oder wie ich das Model definieren muss um da später ran zu kommen.
    Im Widget definiere ich ja das QFileSystemModel einfach, setzte meine Filter und den Rootpath und sende dann direkt an den Listview und Treeview um alles darzustellen.
    Die Möglichkeit bietet QT Quick ja scheinbar nicht direkt oder habe ich da einen Denkfehler?

    Besten Dank im Voraus für die Mühe

    Marco

    PS. etwas vergleichbares wie http://qmlbook.github.io/index.html zum einlesen in das Thema mit dem Treeview / Models wäre schön, das Openbook hat mir beim Einstieg in Quick sehr geholfen


  • Moderators

    @Throndar said in Wie Einstieg in QAbstractItemModel finden?:

    Was sich mir jetzt irgendwie nicht erschließt wie ich im QTQuick an die Daten / das Model ran komme bzw. wo oder wie ich das Model definieren muss um da später ran zu kommen.
    Im Widget definiere ich ja das QFileSystemModel einfach, setzte meine Filter und den Rootpath und sende dann direkt an den Listview und Treeview um alles darzustellen.
    Die Möglichkeit bietet QT Quick ja scheinbar nicht direkt oder habe ich da einen Denkfehler?

    Entweder so wie in dem Link den ich gepostet habe beschrieben, oder mittels qRegisterType() das eigene Model registrieren und in QML instanzieren.

    Die Daten des Models bekommt dann die QML Delegate Komponente. Das Mapping von den variablen namen (auf den der Delegate zu griff hat) zu den ItemRoles sind mit der QAbstractItemModel::roleName() Methode zu implementieren.



  • Hallo ravenworx,

    vielen vielen Dank für die ausführliche Antwort.

    Ich merke schon das ich aktuell noch einige Wissenlücken habe und ich mich in das ganze Thema mehr als nur ein bisschen verwirrt (ganz so einfach wie zuerst Gedacht im QT Widget wird es also nicht).

    Wenn ich es soweit verstanden habe liegen im Model selbst alle Daten (bzw. die Verweise darauf), die Delegate Komponente verwaltet die Navigation / Interaktion auf die Informationen im Model also was gerade benötigt wird bzw. was gerade dargestellt wird.

    Die "roles" sind dann dafür da anzugeben was in dem jeweiligen Datenelement des Items für eine Art Daten benötigt (DecorationRole erwartet ein QColor, QIcon oder QPixmap, dagegen ein DisplayRole einen QString)?

    Wenn das soweit stimmen sollte fehlt mir nur noch eine Struktur oder eine Idee wie man so ein Model selbst aufbaut weil die Möglichkeit ein Filemodel von einem bestimmten Ort anzulegen (wie im Widget ab "Sourcepath") gibt es je in Quick nicht.

    Entschuldige bitte wenn es vielleicht für den Profi nach extrem blöden Fragen klingt, aktuell sind bei mir mit jedem Text den ich zu dem Thema lese nur noch mehr Fragen am auftauchen :(

    Nochmals vielen Dank für deine ganze Mühe!

    Marco


  • Moderators

    @Throndar
    also ein TreeModel zu implementieren ist schon um einiges schwerer als ein list/table model. Also wenn du das model "flach" hälst tust du dir selbst einen großen Gefallen.

    Hier mal ein projekt von mir das links eine liste an foldern zeigt und rechts eine liste mit den darin enthaltenen dateien.

    Vielleicht gibts ja einen Einblick.



  • Hallo raven-worx,

    vielen vielen Dank!

    ich hab mir gerade dein Beispiel runtergeladen und werde das das Projekt versuchen Schritt für Schritt nachzuvollziehen.

    Du hast mir auf jeden Fall schon sehr geholfen :)

    Nochmals vielen Dank für deine ganze Arbeit!

    Marco


Log in to reply