Implementation von QFileIconProvider failt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
snow
User
Beiträge: 25
Registriert: Mittwoch 4. Juli 2012, 08:52

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 :)
lunar

Versuche mal:

Code: Alles auswählen

self.icon_provider = SeIconProvider()
self.model.setIconProvider(self.icon_provider)
snow
User
Beiträge: 25
Registriert: Mittwoch 4. Juli 2012, 08:52

Das hatte ich auch probiert. Hatte aber leider keinen Unterschied gemacht :cry:
lunar

@snow Was geschieht, wenn Du "print" in die Methoden des Provider einfügst? Siehst Du Aufrufe des Providers durch das Modell?
snow
User
Beiträge: 25
Registriert: Mittwoch 4. Juli 2012, 08:52

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
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‽
snow
User
Beiträge: 25
Registriert: Mittwoch 4. Juli 2012, 08:52

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)
BlackJack

@snow: Da müsste man die beiden Methoden wohl entsprechend mit einem Decorator versehen, der sie als SLOTs mit den entsprechenden Typen deklariert.
snow
User
Beiträge: 25
Registriert: Mittwoch 4. Juli 2012, 08:52

Also in meinem Fall mit

@QtCore.Slot(QtCore.QFileInfo)

und

@QtCore.Slot(QtGui.QFileIconProvider.IconType)

oder meinst du mit Dekoratoren was anderes?
BlackJack

@snow: Jup, das meinte ich.
Antworten