Konzeptionsprobleme Dateibrowser (Massenumbenennung)

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
mikar
User
Beiträge: 3
Registriert: Mittwoch 26. März 2014, 19:09

Heyho,

ich versuche grade mit PyQT4 einen filebrowser zu basteln. Hauptsächliches Feature soll die Massenumbenennung von Dateien und Ordnern sein. Vorweg sei gesagt, dass ich erst seit ein paar Monaten programmiere und das hier eines meiner ersten GUI-Projekte ist. Jegliches Feedback ist also willkommen! ;)

So sieht die GUI im Moment aus (mit dem QT Designer gebastelt):
Bild

Der Kern der GUI, der Dateibrowser, ist bisher nur ein QFileSystemModel mit ner extra Spalte. Der code dazu:
http://bpaste.net/show/273864/

Mein Ziel ist, in der "Preview Here"-Spalte eine Vorschau der Datei- und Ordnernamen anzuzeigen, die sich verändern werden, wenn ich die Umbenennungsaktion durchführe.
Im Screenshot würde also in der "autogroup"-Zeile in der Spalte nach dem Dateinamen "autogroupfoo" stehen, alle anderen Einträge in der zweiten Spalte blieben leer.

So zumindest der Gedanke. Mein Problem ist, wie ich das umsetze und ob das überhaupt eine gute Idee ist.

So wie ich das sehe, müsste ich nämlich ständig mit den Indexen des QFileSystemModels und QTreeViews hantieren, sowie mehr oder weniger mein eigenes Data-Modell für die Preview schreiben, wobei ich keine Ahnung habe, wie ich damit am besten anfange und bisher auch sehr wenig zu dem Thema finden konnte. Bisher habe ich zwar den Pfad des derzeit ausgewählten Ordners im QTreeView herausfinden können aber eine Liste der Dateien und Ordnern zu produzieren ist mir noch nicht gelungen und das QFileSystemModel scheint vielleicht auch nicht so gedacht zu sein. Jedenfalls wäre ich für Tips dankbar, wie ich das Umsetzen kann, also die Liste von Dateien und Ordnern in einer Art und Weise erstellen, dass ich das später wieder zurückumsetzen kann, wenn ich die Vorschau an einzelne Dateien/Ordner in dieser Liste anknüpfen und darstellen will.

Als Alternative zu dieser Vorgehensweise fiele mir ein, das QFileSystemModel nur zum Auswählen des Ordners/Arbeitsortes zu benutzen und von dort an direkt an die Umbenennungslogik zu übergeben, die den Pfad durchsucht, eine Liste von Dateien und Ordnern plus Preview zurückgibt, die ich dann relativ bequem und unkompliziert in einem QListView oder QTreeView darstellen könnte. Das würde deutlich weniger Interaktivität erlauben, ist aber vielleicht die bessere Lösung?

MfG,
mikar
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

mikar hat geschrieben:...
So wie ich das sehe, müsste ich nämlich ständig mit den Indexen des QFileSystemModels und QTreeViews hantieren, sowie mehr oder weniger mein eigenes Data-Modell für die Preview schreiben, wobei ich keine Ahnung habe, wie ich damit am besten anfange und bisher auch sehr wenig zu dem Thema finden konnte.
...
Nicht mit Indices am View müsstest Du hantieren, aber auf Modelebene. Das ist relativ einfach erreichbar: Für die einzufügende Spalte gibst Du unter ``data(index)`` einen entsprechend modifizierten Inhalt zurück, z.B. den Wert des ursprünglichen Names (den Du weiter links im Model deinem Bild zufolge findest) plus Deinen Ersetzungsregeln. Am View musst du hierfür zunächst nix ändern.

Edit: Um es mal konkret zu machen (ungetestet):

Code: Alles auswählen

    def data(self, index, role):
        if index.column() == self.columnCount() - 1:
            if role == QtCore.Qt.DisplayRole:
                # kreiere Index für Eintrag aus Dateibaum
                file_index = self.index(index.row(), <Spalte für Dateibaum>, index.parent())
                # hole Eintrag
                entry = self.data(file_index, role)
                # gib modifizierten Eintrag zurück
                return modify(entry)
                #return self.get_preview_text()
            if role == QtCore.Qt.TextAlignmentRole:
                return QtCore.Qt.AlignHCenter
        return super(PreviewFileModel, self).data(index, role)
mikar
User
Beiträge: 3
Registriert: Mittwoch 26. März 2014, 19:09

Hey ferch,

vielen Dank, das hat mir sehr geholfen!

Gruß
Antworten