Ich versuche eine Pyqt-App zu erstellen, die die Verzeichnisstruktur und die darin enthaltenen Dateien untersucht. Was ich tun möchte, ist, zusätzliche Informationen zu den Elementen im qfilesystemmodel hinzuzufügen, zum Beispiel Dateien als "geprüft" oder "nicht markiert" zu markieren. Ich habe festgestellt, dass jedes Element (Datei oder Ordner) im Modell vier Spalten, Name, Größe, Zeitstempel und Typ hat. Ist es möglich, dass das Element eine fünfte Spalte hat, die benutzerdefinierte Informationen (Tags) enthält? Oder gibt es eine Möglichkeit, zusätzliche Informationen zu den Elementen im Modell zu kommentieren? Wenn nicht, denke ich, dass ich ein anderes Modell wie qstanarditemmodel haben muss, um die Tags zu behalten. Aber ich möchte nicht, dass es in einem satteren Modell ist. Danke!Wie füge ich zusätzliche Daten zu den qfilesystemmodel-Elementen hinzu?
Antwort
Die Klasse QFileSystemModel
delegiert an ein Live-Dateisystem. So ist es nicht wirklich enthalten irgendwelche Elemente, denen Sie Informationen hinzufügen können. Die Elemente sind eigentlich die Dateien und Verzeichnisse innerhalb des Dateisystems.
Daraus folgt, dass eine zweite Datenstruktur benötigt wird, um die zusätzliche Information zu halten. Andernfalls müssten Sie die Informationen irgendwie in den Dateien und Verzeichnissen selbst speichern. Dies könnte für bestimmte Dateitypen (z. B. Bilder) möglich sein. Aber es ist offensichtlich nicht möglich, dies für arbiträre Dateitypen zu tun.
Es sollte möglich sein, Unterklasse QFileSystemModel
und reimplement the usual methods, so dass zusätzliche Spalten hinzugefügt werden können. Als Minimum müssen Sie columnCount()
und data()
erneut implementieren - aber die genauen Details Ihrer Vorgehensweise hängen natürlich von der Datenstruktur ab, die Sie für die zusätzlichen Informationen verwenden. Sehr grob könnte es in etwa so aussehen:
class FileSystemModel(QFileSystemModel):
def __init__(self, parent=None):
super(FileSystemModel, self).__init__(parent)
self._data = DataStructure()
def columnCount(self, parent):
return super(FileSystemModel, self).columnCount(parent) + 1
def data(self, index, role):
if index.isValid() and index.column() == self.columnCount() - 1:
if role == QtCore.Qt.DisplayRole:
# return the relevant additional data
elif role == QtCore.Qt.CheckStateRole:
# etc, etc
else:
return super(FileSystemModel, self).data(index,role)
Ohne Zugriff auf die zugrunde liegenden Daten ist jede Vererbung des Modells fragil und bricht leicht. –
Denken Sie daran, dass 'QModelIndex' ein Wegwerfobjekt ist. Sie können die Daten mit absoluten Pfadnamen als Schlüssel in einem Hash speichern, aber das ist auch fragil. Es wird nicht umbenennen, löschen und verschieben. –
@JonHarper. Wenn Sie sich dieses grobe Beispiel genau ansehen, werden Sie feststellen, dass es die zugrunde liegenden Daten überhaupt nicht berührt. Effektiv delegiert es nur an 'QFileSystemModel'. Offensichtlich ist es unklug, Instanzen von 'QModelIndex' zu speichern - falls nötig, verwenden Sie [QPersistentModelIndex] (http://doc.qt.io/qt-4.8/qpersistentmodelindex.html). Ich sehe keinen Grund, warum eine sekundäre Datenstruktur nicht mit einem Dateisystemmodell verknüpft werden kann, um eine oder zwei zusätzliche Spalten hinzuzufügen. Es ist nicht einfach, aber es ist sicherlich möglich, es auf eine solide Art zu tun, wenn es sorgfältig durchdacht ist. – ekhumoro
Kurz gesagt, nein, nicht leicht. Die Qt-Entwickler arbeiten aus Gründen der Komplexität nicht mehr an QFileSystemModel
. Grundsätzlich ist die Backend-Dateisystem-Engine viel zu komplex und zerbrechlich, und QFileSystemModel
verlässt sich vollständig darauf.
Sie konnte reimplementieren QFileSystemModel
, aber es wäre eine viel schmerzhafter Arbeit und den Zugriff auf die privaten Header erfordern.
Ja, ich denke ich sollte das lieber nicht machen. –
Sie suchen nach QIdentityProxyModel. – peppe
@Bahrom Danke, ich werde es versuchen. –
@peppe Danke, ich werde danach suchen. –