Seite 1 von 1

Implementation von QFileIconProvider failt

Verfasst: Mittwoch 7. August 2013, 22:37
von snow
Hi,

ich habe ein Problem mit dem QFileIconProvider. ich möchte für mein QTreeView das QFileSystem Model einsetzen, allerdings möchte ich dafür meine eigenen Icons für Dateien und Ordner angezeigt bekommen. Ich wollte nun wie folgt vorgehen. Indem ich meine eigene QFileIconProvider Klasse schreibe. Diese sieht wie folgt aus:

Code: Alles auswählen

class SeIconProvider(QtGui.QFileIconProvider):

    def __init__(self):
        QtGui.QFileIconProvider.__init__(self)

        self.rsFileIcon = QtGui.QIcon(':images/rs-file.png')
        self.otherFileIcon = QtGui.QIcon(':images/newfile.png')
        self.folderIcon = QtGui.QIcon(':images/openFolder.png')

    def icon(self, type):
        if type == self.File:
            return self.rsFileIcon
        if type == self.Folder:
            return self.folderIcon

        return self.otherFileIcon

    def icon(self, info):
        if info.isFile():
            # if info.fileName().endswith('.rs'):
            #     return self.rsFileIcon
            return self.otherFileIcon
        if info.isDir():
            return self.folderIcon
        return self.otherFileIcon

    def type(self, info):
        if info.isDir():
            return 'Directory'
        return 'File'


Anschließend setze ich es noch als IconProvider für meinen QTreeView:

Code: Alles auswählen

class FolderView(QtGui.QTreeView):

        def __init__(self):
            QtGui.QTreeView.__init__(self)

            self.createComponents()
            self.createLayout()

        def createComponents(self):
            self.model = QtGui.QFileSystemModel()
            self.model.setIconProvider(SeIconProvider())
            self.setModel(self.model)

        def createLayout(self):
            self.setHeaderHidden(True)

            for i in range(1, 4):
                self.hideColumn(i)

Das Problem ist nun das mir einfach keine Icons angezeigt werden. Daran dass er die Bilder nicht findet kann es nicht liegen, da ich die gleichen bereits in meiner Tool- und Menubar verwende. Der Code wirft allerdings auch keinerlei Fehler, sodass ich zurzeit ziemlich auf dem Schlauch stehe :oops: Ich verwende Python 2.7.5 und PySide 1.2.
Vielleicht weiß jemand was ich falsch mache. Danke schon einmal im voraus :)

Re: Implementation von QFileIconProvider failt

Verfasst: Mittwoch 7. August 2013, 22:51
von lunar
Versuche mal:

Code: Alles auswählen

self.icon_provider = SeIconProvider()
self.model.setIconProvider(self.icon_provider)

Re: Implementation von QFileIconProvider failt

Verfasst: Mittwoch 7. August 2013, 22:54
von snow
Das hatte ich auch probiert. Hatte aber leider keinen Unterschied gemacht :cry:

Re: Implementation von QFileIconProvider failt

Verfasst: Donnerstag 8. August 2013, 09:12
von lunar
@snow Was geschieht, wenn Du "print" in die Methoden des Provider einfügst? Siehst Du Aufrufe des Providers durch das Modell?

Re: Implementation von QFileIconProvider failt

Verfasst: Donnerstag 8. August 2013, 11:00
von snow
Also die zweite und dritte Methode werden aufgerufen, aber die erste nicht.

Code: Alles auswählen

def icon(self, type):
        print("methode 1")
        if type == self.File:
            return self.rsFileIcon
        if type == self.Folder:
            return self.folderIcon

        return self.otherFileIcon
Hab mal spaßes halber versucht die beiden icon methoden zu vertauschen. Nun werden Methode 1 und 3 aufgerufen aber die andere icon methode nicht mehr

Re: Implementation von QFileIconProvider failt

Verfasst: Donnerstag 8. August 2013, 11:17
von BlackJack
@snow: Du hast zwei Methoden mit dem selben Namen definiert, es kann aber unter einem Namen immer nur ein Attribut geben. Wie sollte das auch mit mehreren Werten unter dem gleichen Attributnamen funktionieren‽

Re: Implementation von QFileIconProvider failt

Verfasst: Donnerstag 8. August 2013, 12:06
von snow
Wie würde ich das dann umsetzen, wenn in der Original QFileIconProvider auch 2 Methoden existieren, die beide die gleiche Anzahl an Parametern haben und sich eigentlich nur im typ unterscheiden?

https://deptinfo-ensip.univ-poitiers.fr ... onProvider


Ich habe das Problem jetzt von einer ganz anderen Stelle aus gelöst. Ich habe meine eigene QfileSystemModel Klasse geschrieben und die data Methode dort überschrieben um dort meine eigenen Icons einfließen zu lassen. Hier der Code meiner Lösung, falls jemand irgendwann das gleiche Problem haben sollte:

Code: Alles auswählen

class SeFileSystemModel(QtGui.QFileSystemModel):

    def __init__(self):
        QtGui.QFileSystemModel.__init__(self)
        self.fileEndPattern = re.compile("^.*\.(\w{2,4})$")

        def data(self, index, role):
        if index.column() == 0 and role == QtCore.Qt.DecorationRole:
            if self.fileEndPattern.match(index.data()) is not None:
                if index.data().endswith('rs'):
                    return QtGui.QIcon(':icons/rs-file.png')
                return QtGui.QIcon(':icons/newfile.png')

            return QtGui.QIcon(':icons/openFolder.png')

        return super(SeFileSystemModel, self).data(index, role)

Code: Alles auswählen

class FolderView(QtGui.QTreeView):

        def __init__(self):
            QtGui.QTreeView.__init__(self)

            self.createComponents()

        def createComponents(self):
            self.model = SeFileSystemModel()
            self.setModel(self.model)

Re: Implementation von QFileIconProvider failt

Verfasst: Donnerstag 8. August 2013, 13:35
von BlackJack
@snow: Da müsste man die beiden Methoden wohl entsprechend mit einem Decorator versehen, der sie als SLOTs mit den entsprechenden Typen deklariert.

Re: Implementation von QFileIconProvider failt

Verfasst: Donnerstag 8. August 2013, 14:41
von snow
Also in meinem Fall mit

@QtCore.Slot(QtCore.QFileInfo)

und

@QtCore.Slot(QtGui.QFileIconProvider.IconType)

oder meinst du mit Dekoratoren was anderes?

Re: Implementation von QFileIconProvider failt

Verfasst: Donnerstag 8. August 2013, 16:59
von BlackJack
@snow: Jup, das meinte ich.