IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Explorateur de fichiers avec QFileSystemModel


Sujet :

PyQt Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 195
    Points : 156
    Points
    156
    Par défaut Explorateur de fichiers avec QFileSystemModel
    Bonjour à tous,

    Je cherche à réaliser un simple widget permettant d'explorer mes disques (locaux et reseaux).
    Pour faire simple, j'ai 3 listView pour les disques/dossiers/fichiers et je voudrais que lorsque je clique sur un disque/dossier, ca met à jour la liste dossier/fichier.

    J'etais parti pour utiliser QDirModel mais, d' après la doc, il vaut mieux utiliser la classe QFileSystemModel.. Je ne parviens pas à réaliser ce que je veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    import sys,os
    from PyQt4.QtGui import *
    from PyQt4.QtCore import *
     
    class viewDir(QWidget):
    	def __init__(self,parent=None):
    		super(viewDir,self).__init__(parent)
    		self.vGrid = QVBoxLayout()
    		self.setLayout(self.vGrid)
     
    		self.diskModel = QFileSystemModel()
    		self.diskModel.setFilter(QDir.Drives)
    		self.diskModel.setRootPath(QDir.currentPath())
     
    		self.dirModel = QFileSystemModel()
    		self.dirModel.setFilter(QDir.AllDirs)
     
    		self.fileModel = QFileSystemModel()
    		self.fileModel.setFilter(QDir.Files)
     
     
    		self.listDisks = QListView()
    		self.listDisks.setModel(self.diskModel)
    		self.listDisks.setRootIndex(self.fileModel.index(QDir.currentPath()))
     
    		self.listDirs = QListView()		
    		self.listFiles = QListView()
     
    		self.vGrid.addWidget(self.listDisks)
    		self.vGrid.addWidget(self.listDirs)
    		self.vGrid.addWidget(self.listFiles)
     
    		self.connect(self.listDisks,SIGNAL("clicked (const QModelIndex&)"),lambda : self.changeDisk())
     
    	def changeDisk(self):
    		d= self.diskModel.filePath(self.listDisks.currentIndex())
    		self.dirModel.setRootPath(d)
    		self.dirModel.setFilter(QDir.AllDirs)
    		self.listDirs.setModel(self.dirModel)
     
    if __name__=="__main__":
    		app=QApplication(sys.argv)
    		app.setPalette(QApplication.style().standardPalette())
    		ui=viewDir()
    		ui.show()
     
    		sys.exit(app.exec_())
    Quand je clique sur un disque, je n'ai pas la visu de mes dossiers.
    Pouvez vous m'indiquer la manière de procéder??

    Un autre soucis, je souhaite avoir le chemin réseau d'un disque? comment puis je l'obtenir?

    Merci

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je suis novice sur ce sujet, et je me suis contenté de traduire en Python la FAQ Qt: http://qt.developpez.com/faq/?page=modelview#model-view.

    Voilà ce que ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python 2.7
     
    import sys
    from PyQt4 import QtCore, QtGui
     
    app = QtGui.QApplication(sys.argv)
     
    model = QtGui.QFileSystemModel()
    model.setRootPath(QtCore.QDir.currentPath())
     
    treeView = QtGui.QTreeView()
    treeView.setModel(model)
     
    listView = QtGui.QListView()
    listView.setModel(model)
     
    tableView = QtGui.QTableView()
    tableView.setModel(model)
     
    selection = treeView.selectionModel()
    listView.setSelectionModel(selection)
    tableView.setSelectionModel(selection)
     
    selection.currentChanged.connect(listView.setRootIndex)
    selection.currentChanged.connect(tableView.setRootIndex)
     
    treeView.show()
    listView.show()
    tableView.show()
     
    sys.exit(app.exec_())
    En espérant que ça puisse te servir de source d'inspiration.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut


    Voici un bout de code que je voulais mettre au bout de celui ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    # -*- coding: iso-8859-1 -*-
    #Code pour Python3. Pour Python2, enlever les parenthèses après les print.
     
    import sys
    from PyQt4 import QtGui,  QtNetwork,  QtCore
     
    h = 200
    l = 400
     
    serveur = monserveur
    port = monport
    login = monlogin
    mdp = monmdp
     
    etat = {0:"Aucune connexion",  1:"Résolution du nom en cours",  2:"Tentative de connexion en cours", 
            3:"Connexion établie",  4:"Identification établie", 5:"Déconnexion en cours"}
     
     
    class Frame(QtGui.QMainWindow):
        def __init__(self, parent=None):
            QtGui.QMainWindow.__init__(self, parent)
            self.resize(l,h)
            self.setFont(QtGui.QFont("Verdana",8))
     
            self.btn = QtGui.QPushButton("Se connecter", self)
            self.btn.move(10, 10)
            self.btn1 = QtGui.QPushButton("Se déconnecter", self)
            self.btn1.move(110, 10)
            self.btn2 = QtGui.QPushButton("Liste", self)
            self.btn2.move(210, 10)
     
            self.txt = QtGui.QTextEdit(self)
            self.txt.setGeometry(10, 50, 150, 100)
     
            self.treewid = QtGui.QTreeWidget(self)
            self.treewid.setGeometry(200, 50, 150, 100)
     
            self.ftp = QtNetwork.QFtp(self)
     
            self.btn.clicked.connect(self.actionCo)    
            self.ftp.stateChanged.connect(self.stateServer)
            self.btn1.clicked.connect(self.actionDeco)
            self.btn2.clicked.connect(self.list_)
            self.treewid.itemClicked.connect(self.cd_)
     
            self.ftp.listInfo.connect(self.list_info)
     
     
        def actionCo(self):
            if self.ftp.state() != 0:
                print ('Serveur en cours de connexion ou connecté')
            else:
                print ('Début de connexion')
                self.ftp.connectToHost(serveur,  port)
                self.ftp.login(login,  mdp)
     
        def actionDeco(self):
            if self.ftp.state() == 0:
                print('Serveur non connecté')
            else:
                self.ftp.close()
     
        def stateServer(self):
            print (etat[self.ftp.state()])
            print()
     
        def list_(self):
            self.txt.clear()
            self.treewid.clear()
            racine = QtGui.QTreeWidgetItem()
            racine.setText(0,'..')
            self.treewid.addTopLevelItem(racine)
            self.liste = self.ftp.list()
     
        def list_info(self,i):
            item = QtGui.QTreeWidgetItem()
            if i.isDir():
                item.setText(0,i.name())
                self.treewid.addTopLevelItem(item)
            if i.isFile():
                self.txt.append(i.name())
     
        def cd_(self, item, col):
            self.ftp.cd(item.text(0))
            self.list_()    
     
     
    app = QtGui.QApplication(sys.argv)
    frame = Frame()
    frame.show()
    sys.exit(app.exec_())
    Avec ça tu devrais pouvoir résoudre ton problème coté réseau, en tout cas si tu passes par du FTP.

    Pour ta deuxième question, je ne me suis jamais penché dessus, mais tu peux zieuter la doc QtNetwork de dvp pour ça.

    Bon courage.

    PS: Petite chose, si je peux me permettre. Personnellement je pense qu'il serait préférable de faire tes imports différemment. C'est plus une question de lisibilité par la suite lorsque ton code sera plus conséquent... Tu t'y retrouvera mieux. Mais c'est très subjectif comme avis je te l'accorde
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 195
    Points : 156
    Points
    156
    Par défaut
    Merci pour vos conseils.

    L'utilisation de QFileSystemModel est lente. J'ai l'impression que cette classe élabore l'arborescence complète de mon disque.
    Quand je lance le module de Tyrtamos (ou le mien) mon appli se fige quelques secondes (en prenant racine les disques)

    Je veux intégrer un widget type explorateur de fichier ,à gauche de mon appli.
    Ce widget contiendrait 3 listView (disques, dossiers, fichiers).Au demarrage on ne verrait que les disques et de là on navigue...
    Je crains de devoir faire ça "à la main" car c'est la croix et la bannière
    Pourtant je suppose que ca du déjà être fait ce genre de widget.

    bonne journée

  5. #5
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 494
    Points : 152
    Points
    152
    Par défaut
    Bonjour
    Je me demande bien ce que cela peut donner ajourd'hui.... avec QT5.

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par dedalios Voir le message
    Je me demande bien ce que cela peut donner ajourd'hui.... avec QT5.
    Voilà un petit code de principe avec Qt5:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    import os
     
    from PyQt5.QtGui import QFont
    from PyQt5.QtWidgets import (QApplication, QFileSystemModel, QTreeView, 
                                 QFrame, QGridLayout, QMainWindow)
     
    ##############################################################################
    class NavigFichiers(QMainWindow):
     
        #=========================================================================
        def __init__(self, repertoire, parent=None):
            super().__init__(parent)
     
            self.resize(800, 600)
            self.setWindowTitle("Navigateur de fichiers")
     
            # crée le modèle
            model = QFileSystemModel()
            model.setRootPath(repertoire)
     
            #Crée le QTreeView et intégre le modèle
            self.view = QTreeView()
            self.view.setModel(model)
            self.view.setRootIndex(model.index(repertoire))
     
            # Police de caractères à utiliser
            font = QFont()
            font.setStyleHint(QFont.Monospace)
            self.view.setFont(font)
     
            # largeur de la colonne 0
            self.view.setColumnWidth(0, 350)
     
            # place le QTreeView dans la fenêtre
            self.setCentralWidget(QFrame())
            layout = QGridLayout()
            layout.addWidget(self.view, 0, 0)
            self.centralWidget().setLayout(layout)
     
            # Etablissement lien entre signal et méthode
            self.view.clicked.connect(self.clicligne)
     
        #=========================================================================
        def clicligne(self, qindex):
     
            nom = self.view.model().fileName(qindex)
            chemin =  self.view.model().filePath(qindex)
            if os.path.isdir(chemin):
                print("Répertoire:", nom, "===> avec chemin:", chemin)
            else:
                print("fichier:", nom, "===> avec chemin:", chemin)
     
    ##############################################################################
    if __name__ == '__main__':
        app = QApplication(sys.argv)
     
        navigfichiers = NavigFichiers("C:\\")
        navigfichiers.show()
     
        sys.exit(app.exec_())
    Ce code n'a pas l'air d'être spécialement lent.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2022
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    À quoi correspond la variable qindex ?

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Lyreco1 Voir le message
    A quoi correspond la variable qindex ?
    Le "self.view" est un QTreeView donc un objet montrant différents items sous forme d'arbre constitué de lignes. Il est connecté au slot "clicligne" donc cela doit être l'index de la ligne cliquée...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2022
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Le "self.view" est un QTreeView donc un objet montrant différents items sous forme d'arbre constitué de lignes. Il est connecté au slot "clicligne" donc cela doit être l'index de la ligne cliquée...
    Ah d'accord, merci beaucoup !

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Lyreco1 Voir le message
    Ah d'accord, merci beaucoup !
    Après on peut aller voir la doc
    1. on commence par regarder celle du QTreeView: https://doc.qt.io/qt-5/qtreeview.html. Mais rien sur le signal "clicked". Cela signifie que ce signal est hérité d'un objet parent
    2. on regarde donc tous les membres y compris ceux qui sont hérités => https://doc.qt.io/qt-5/qtreeview-members.html. Là on trouve un "clicked"
    3. on regarde à quoi ça correspond => https://doc.qt.io/qt-5/qabstractitemview.html#clicked. On voit que l'élément embarqué par le signal est un QModelIndex
    4. on regarde la doc du QModelIndex et on voit que c'est un objet dédié aux index => "This class is used as an index into item models"


    Ici un petit tutoriel PyQt https://pyqt.developpez.com/telechar.../47/Hello-Word
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/10/2014, 15h26
  2. Explorateur de fichier avec Firefox
    Par Depp021 dans le forum Firefox
    Réponses: 1
    Dernier message: 31/07/2013, 11h22
  3. [AC-2007] Ouvrir un fichier avec l'explorateur windows
    Par greg360 dans le forum VBA Access
    Réponses: 5
    Dernier message: 18/11/2010, 16h16
  4. Réponses: 2
    Dernier message: 05/05/2010, 13h59
  5. Explorateur de fichier avec limitation
    Par Shogun dans le forum Composants VCL
    Réponses: 12
    Dernier message: 30/05/2005, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo