Ordnerstruktur auf Button legen

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
pfirsiche
User
Beiträge: 4
Registriert: Dienstag 6. Mai 2008, 12:22

Hi Leute!
Ich habe ein Problem und zwar will ich bei einem Programm einen Button erstellen, der mir die Windows-Ordnerstruktur anzeigt, allerdings nur die Ordner, in denen sich bestimmte Files befinden (in meinem Fall *.ini-Files). Er soll dabei nicht die Files selbst anzeigen.
Der gewünschte Button soll einen ähnlichen Zweick wie die Methode openFolder für Windwos erfüllen.
Hat jemand schon mal etwas ähnliches programmiert bzw. gemacht??
Wäre für jede Hilfe dankbar!

gruß,

pfirsiche
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wozu willst Du denn auf einem Button eine Struktur darstellen? *wunder*

Naja, prinzipiell solltest du mit dem os-modul und den div. Funktionen (z.B. walk()) einiges erledigen können, deine Struktur aufzustellen. Naja, dann mußt Du halt in einem GUI-Toolkit nach einer passenden Möglichkeit suchen, eine Baumstruktur darzustellen. Diese dann auf einen Button zu bringen, ist sicherlich nicht ganz unproblematisch! (Da ein Button dafür natürlich nicht gedacht ist ;-))
pfirsiche
User
Beiträge: 4
Registriert: Dienstag 6. Mai 2008, 12:22

Hi, Danke für die Antwort Hyperion.
Also ich habs wohl leider etwas schwammig formuliert.
Es geht darum, dass nach betätigen des Buttons vom Programm von einem statischen Pfad (im Code festgelegt) aus alle Unterordner durchsucht werden, in welchem sich *.ini-Files befinden. Sind dann welche gefunden, sollen die Ordner in denen sich die Files befinden in einem Tab (als Liste QListView o.ä.) angzeigt werden.
Wählt man dann einen dieser Ordner aus, sollen in einem Tab daneben dann die *.ini Files angezeigt werden, die sich in diesem Ordner befinden.
Anahand eines anderen threads hier, habe ich schon mal eine Suchfunktion gefunden, wie ich mir Files mit spezieller Endungs suchen kann, allerdings hat mich das noch nicht so ganz weitergebracht bis jetzt.
Hoffe das war jetzt etwas besser? :wink:

danke u. gruß

pfirsiche
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann schau dir mal im Modul "os" die Funktion "walk" an. Damit kannst du ein Verzeichnis und alle seine Unterverzeichnisse durchlaufen.

Du sammelst damit einfach alle Verzeichnisse auf, die eine ini-Datei enthalten und erzeugst ein "set" mit den dazugehörigen Ordnern.

Schau dir auch noch mal das Modul "os.path" an, da sind einige nützliche Funktionen zum Umgang mit Datei- und Verzeichnisnamen.

Edit: Ach, ich will mal nicht so sein:

Code: Alles auswählen

import os

def filterFolder(folder, ext):
    folders = set()
    
    for root, dirs, files in os.walk(folder):
        if(any(map(lambda x:os.path.splitext(x)[1]=="."+ext, files))):
            folders.add(os.path.dirname(root))

    return folders

print filterFolder("c:\\python25", "ini")
Der Lambda-Ausdruck ist aber schon hart an der Grenze des lesbaren...
pfirsiche
User
Beiträge: 4
Registriert: Dienstag 6. Mai 2008, 12:22

Danke für die schnelle Antwort u. deine Mühe!
Habe das ganze jetzt bei mir mal eingebaut und es schaut jetzt für den Buttonklick so aus:

Code: Alles auswählen

def filllv2 ( self ):
        """ mig """
        folders = set()
        folder =  '.'
        ext = "ini"
        for root, dirs, files in os.walk(folder):
            if(any(map(lambda x:os.path.splitext(x)[1]=="."+ext, files))):
                folders.add(os.path.dirname(root))
                for y in folders:
                    fi = QtGui.QTreeWidgetItem(self.ui.treeWidget_2)
                    fi.setText(0, self.tr(y))
                    print y
so weit so gut.
Allerdings bekomme ich jetzt in meinem TreeWidget (für mein Beispiel liegen im Ordner Demos 3 Unterordner die je ein *.ini-File beinhalten) 3 mal den Ordner Demos angezeigt, allerdings nicht die Unterordner, die ich eigentlich wollte.
Bin jetzt schon fast der Überzeugung, dass es vielleicht besser wäre (?) wenn man das ganze als Baumstruktur à la Windows-Explorer anzeigen lassen sollte oder nicht. Leider steh ich da aber absolut auf dem Schlauch als Fast-Newbie ;-)
Kann vielleicht jemand noch weiterhelfen??

DANKE!

pfirsiche
lunar

Container-Widget Klassen sind out. In Qt4 gibt es das neue Model-View-Framework, welches gerade hier die Arbeit vereinfacht.

Statt ``QTreeWidget`` und manuellem Hickhack bist du mit ``QTreeView``, ``QListView`` und ``QDirModel`` besser beraten. Mit den ``setNameFilters`` und ``setFilter`` Methoden des ``QDirModel`` kannst du auch dein Filtermuster ganz einfach implementieren.
pfirsiche
User
Beiträge: 4
Registriert: Dienstag 6. Mai 2008, 12:22

Hi Leute!
Nach längerer Zeit konnte ich mich jetzt mal wieder mit dem Problem beschäftigen.
Ich bin mittlerweile soweit, dass ich die Ordnerstruktur schön in einen QTreeView bekomme. Soweit so gut.
Nur stehe ich jetzt vor einem anderen Problem.
Ich kriege einfach das QDirModel welchem ich den TreeView übergebe einfach nicht auf eine dynamische Größe. Der QTreeView-Bereich ändert sich wenn ich das Fenster vergößere, aber die Ordnerstruktur leider nicht.
Ich geb euch mal den Code für den Button den ich erstellt habe. Vielleicht weiß ja jemand weiter...

Code: Alles auswählen

  tree = QtGui.QTreeView(self.ui.treeView)
        model = QtGui.QDirModel(tree)
        tree.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        tree.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        tree.resize (171,271)
        
        treeSizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding)
        tree.setSizePolicy(treeSizePolicy)
        pfad= '.'
       
        
        tree.setWindowTitle(tree.tr("Dir View"))
        tree.hideColumn(3)
        tree.columnWidth(0)
        tree.header().resizeSection(0,300)
        
      
      
        tree.expand(model.index(pfad))
        tree.show()
Also ums noch bissl genauer zu machen.
Das Problem liegt da, dass ich aus der Variable "model" kein setSizePolicy machen kann...
(ach ja nochwas: wie kann ich aus meinem TreeView eine Datei auswählen und diese dann weiterbearbeiten????)
lunar

Wieso nutzt du nicht einfach den Designer oder zumindest die Layout Klassen von Qt4?

Was das Auswählen angeht, ein View-Widget hat eine ``getSelectedIndexes`` Methode ;) Und die Dokumentation von ``QDirModel`` verrät dir, wie du aus dem ModelIndexes die korrespondieren Pfade erhältst ;)

Btw, dein QTreeView-Bereich hat mit QTreeView offenbar nichts zu tun, sondern ist ein einfaches Widget. Die "Ordnerstruktur" ist dann der QTreeView. Nenn das Kind beim Namen, dann weiß auch jeder, worum es geht ;)
Antworten