Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. French
  4. QFileSystemModel limiter la liste des fichiers suivant le contenu
Forum Updated to NodeBB v4.3 + New Features

QFileSystemModel limiter la liste des fichiers suivant le contenu

Scheduled Pinned Locked Moved Solved French
10 Posts 3 Posters 1.8k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Offline
    L Offline
    Laguimauve
    wrote on last edited by
    #1

    Bonjour à tous,

    J'aimerais lister les fichiers dans une QListView qui contiennent [???] dans le nom du fichier. Exemple :

    monfichier [xhZ].mp3 - vrai
    montest 123.mp3 - faux

    Dans l'image ci-après, j'aimerais que le 2, 3 et le 8ème fichier dans la colonne de droite n'y soit pas.
    alt text

    Voici mon code :

        QString dirDesktopLocation;
        if (ui->letGoToPath->text().isEmpty()) {
            dirDesktopLocation = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
            ui->letGoToPath->setText(dirDesktopLocation);
        }
        else {
            dirDesktopLocation = QDir::cleanPath(ui->letGoToPath->text());
        }
    
        directoryModel = new QFileSystemModel(this);
        directoryModel->setFilter(QDir::NoDotAndDotDot | QDir::AllDirs);
        directoryModel->setRootPath("");
        QModelIndex idx;
        idx = directoryModel->index(dirDesktopLocation);
    
        ui->trvDir->setModel(directoryModel);
        ui->trvDir->setRootIndex(directoryModel->index(0));
        ui->trvDir->hideColumn(1);
        ui->trvDir->hideColumn(2);
        ui->trvDir->hideColumn(3);
        ui->trvDir->expand(idx);
        ui->trvDir->scrollTo(idx);
        ui->trvDir->setCurrentIndex(idx);
    
        fileModel = new QFileSystemModel();
        fileModel->setFilter(QDir::NoDotAndDotDot | QDir::Files);
        fileModel->setRootPath("");
        ui->lvwFiles->setModel(fileModel);
        ui->lvwFiles->setRootIndex(fileModel->setRootPath(dirDesktopLocation));
    
    

    Merci D'avance pour vos réponses.

    KroMignonK 1 Reply Last reply
    0
    • L Laguimauve

      @KroMignon , ne fonctionne pas.

      J'ai testé avec des parenthèses au lieu des crochets dans le nom du fichier et là ça fonctionne

      Exemple : B.B. King - Don't Answer The Door (fo8).mp3

          fileModel->setNameFilters(QStringList() << "*(???)*.*");
      

      cet exemple fonctionne.

      @KroMignon en testant ta dernière proposition avec les parenthèses, ça ne donne rien.

      Mon objectif est d'afficher les fichiers contenant [???] dans un dossier particulier.

      KroMignonK Offline
      KroMignonK Offline
      KroMignon
      wrote on last edited by
      #8

      @Laguimauve said in QFileSystemModel limiter la liste des fichiers suivant le contenu:

      Mon objectif est d'afficher les fichiers contenant [???] dans un dossier particulier.

      Le problème avec les crochets [], est que ceux sont des caractères spéciaux pour les expressions régulières.
      Et j'ai vu que dans les version récentes de Qt ce n'est plus QRegExp qui est utilisé mais QRegularExpression::wildcardToRegularExpression()
      Et d'après la documentation, un \ n'est plus utilisé comme symbole d'échappement et comme les crochets [] ont une signification particulière, ça me semble du coup beaucoup moins simple comme problème!

      Est-ce que "*[[]???[]]*" fonctionne?

      It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

      1 Reply Last reply
      2
      • L Laguimauve

        Bonjour à tous,

        J'aimerais lister les fichiers dans une QListView qui contiennent [???] dans le nom du fichier. Exemple :

        monfichier [xhZ].mp3 - vrai
        montest 123.mp3 - faux

        Dans l'image ci-après, j'aimerais que le 2, 3 et le 8ème fichier dans la colonne de droite n'y soit pas.
        alt text

        Voici mon code :

            QString dirDesktopLocation;
            if (ui->letGoToPath->text().isEmpty()) {
                dirDesktopLocation = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
                ui->letGoToPath->setText(dirDesktopLocation);
            }
            else {
                dirDesktopLocation = QDir::cleanPath(ui->letGoToPath->text());
            }
        
            directoryModel = new QFileSystemModel(this);
            directoryModel->setFilter(QDir::NoDotAndDotDot | QDir::AllDirs);
            directoryModel->setRootPath("");
            QModelIndex idx;
            idx = directoryModel->index(dirDesktopLocation);
        
            ui->trvDir->setModel(directoryModel);
            ui->trvDir->setRootIndex(directoryModel->index(0));
            ui->trvDir->hideColumn(1);
            ui->trvDir->hideColumn(2);
            ui->trvDir->hideColumn(3);
            ui->trvDir->expand(idx);
            ui->trvDir->scrollTo(idx);
            ui->trvDir->setCurrentIndex(idx);
        
            fileModel = new QFileSystemModel();
            fileModel->setFilter(QDir::NoDotAndDotDot | QDir::Files);
            fileModel->setRootPath("");
            ui->lvwFiles->setModel(fileModel);
            ui->lvwFiles->setRootIndex(fileModel->setRootPath(dirDesktopLocation));
        
        

        Merci D'avance pour vos réponses.

        KroMignonK Offline
        KroMignonK Offline
        KroMignon
        wrote on last edited by KroMignon
        #2

        @Laguimauve Bonjour et bienvenu dans le forum.

        Pour filtrer les fichiers, il suffit de le configurer (QFileSystemModel::setNameFilters()) et de l'activer (QFileSystemModel::setNameFilterDisables()).

        fileModel = new QFileSystemModel(this);
        fileModel->setFilter(QDir::NoDotAndDotDot | QDir::Files);
        fileModel->setRootPath("");
        fileModel->setNameFilters(QStringList() << "*[???]*.*");
        fileModel->setNameFilterDisables(false);
        ...
        

        It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

        1 Reply Last reply
        1
        • L Offline
          L Offline
          Laguimauve
          wrote on last edited by
          #3

          @KroMignon Merci pour ta réponse rapide.

          ça ne fonctionne pas.
          La liste reste vide.
          si je passe à True -> fileModel->setNameFilterDisables(true); je vois l'ensemble des fichiers grisés.

          Voici le code :

              fileModel = new QFileSystemModel();
              fileModel->setFilter(QDir::NoDotAndDotDot | QDir::Files);
              fileModel->setRootPath("");
              fileModel->setNameFilters(QStringList() << "*[???]*.*");
              fileModel->setNameFilterDisables(false);
              ui->lvwFiles->setModel(fileModel);
              ui->lvwFiles->setRootIndex(fileModel->setRootPath(dirDesktopLocation));
          

          un "*.mp3", me donne bien un résultat. Je pensais le faire avec un QSortFilterProxyModel et un setFilterRegExp. Mais ça ne fonctionne pas. Je tourne un peu en rond.

          KroMignonK 1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by SGaist
            #4

            Bonsoir,

            Et avec "*\\\[???\\\]*.*" ?

            [edit: correction du code, l'éditeur mange les\ ]

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            1 Reply Last reply
            0
            • L Offline
              L Offline
              Laguimauve
              wrote on last edited by
              #5

              @SGaist said in QFileSystemModel limiter la liste des fichiers suivant le contenu:

              \[???\].*

              Bonjour @SGaist ,

              négatif :(
              Des combinaisons comme "_." ou "B.mp3", fonctionnent très bien.

              Bonne journée,

              1 Reply Last reply
              0
              • L Laguimauve

                @KroMignon Merci pour ta réponse rapide.

                ça ne fonctionne pas.
                La liste reste vide.
                si je passe à True -> fileModel->setNameFilterDisables(true); je vois l'ensemble des fichiers grisés.

                Voici le code :

                    fileModel = new QFileSystemModel();
                    fileModel->setFilter(QDir::NoDotAndDotDot | QDir::Files);
                    fileModel->setRootPath("");
                    fileModel->setNameFilters(QStringList() << "*[???]*.*");
                    fileModel->setNameFilterDisables(false);
                    ui->lvwFiles->setModel(fileModel);
                    ui->lvwFiles->setRootIndex(fileModel->setRootPath(dirDesktopLocation));
                

                un "*.mp3", me donne bien un résultat. Je pensais le faire avec un QSortFilterProxyModel et un setFilterRegExp. Mais ça ne fonctionne pas. Je tourne un peu en rond.

                KroMignonK Offline
                KroMignonK Offline
                KroMignon
                wrote on last edited by KroMignon
                #6

                @Laguimauve said in QFileSystemModel limiter la liste des fichiers suivant le contenu:

                un "*.mp3", me donne bien un résultat

                Bonjour, je crois comprendre pourquoi ça ne fonctionne pas;
                J'ai jeté un oeil dans le code source et il semblerait que le filtre est sous forme de RegEx.
                Ceci devrait fonctionner:

                  fileModel = new QFileSystemModel();
                    fileModel->setFilter(QDir::NoDotAndDotDot | QDir::Files);
                    fileModel->setRootPath("");
                    fileModel->setNameFilters(QStringList() << "\\\[?{3}\\\]"); // Filter: 3 caractères entre crochets
                    fileModel->setNameFilterDisables(false);
                    ui->lvwFiles->setModel(fileModel);
                    ui->lvwFiles->setRootIndex(fileModel->setRootPath(dirDesktopLocation));
                

                It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                1 Reply Last reply
                0
                • L Offline
                  L Offline
                  Laguimauve
                  wrote on last edited by Laguimauve
                  #7

                  @KroMignon , ne fonctionne pas.

                  J'ai testé avec des parenthèses au lieu des crochets dans le nom du fichier et là ça fonctionne

                  Exemple : B.B. King - Don't Answer The Door (fo8).mp3

                      fileModel->setNameFilters(QStringList() << "*(???)*.*");
                  

                  cet exemple fonctionne.

                  @KroMignon en testant ta dernière proposition avec les parenthèses, ça ne donne rien.

                  Mon objectif est d'afficher les fichiers contenant [???] dans un dossier particulier.

                  KroMignonK 1 Reply Last reply
                  0
                  • L Laguimauve

                    @KroMignon , ne fonctionne pas.

                    J'ai testé avec des parenthèses au lieu des crochets dans le nom du fichier et là ça fonctionne

                    Exemple : B.B. King - Don't Answer The Door (fo8).mp3

                        fileModel->setNameFilters(QStringList() << "*(???)*.*");
                    

                    cet exemple fonctionne.

                    @KroMignon en testant ta dernière proposition avec les parenthèses, ça ne donne rien.

                    Mon objectif est d'afficher les fichiers contenant [???] dans un dossier particulier.

                    KroMignonK Offline
                    KroMignonK Offline
                    KroMignon
                    wrote on last edited by
                    #8

                    @Laguimauve said in QFileSystemModel limiter la liste des fichiers suivant le contenu:

                    Mon objectif est d'afficher les fichiers contenant [???] dans un dossier particulier.

                    Le problème avec les crochets [], est que ceux sont des caractères spéciaux pour les expressions régulières.
                    Et j'ai vu que dans les version récentes de Qt ce n'est plus QRegExp qui est utilisé mais QRegularExpression::wildcardToRegularExpression()
                    Et d'après la documentation, un \ n'est plus utilisé comme symbole d'échappement et comme les crochets [] ont une signification particulière, ça me semble du coup beaucoup moins simple comme problème!

                    Est-ce que "*[[]???[]]*" fonctionne?

                    It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                    1 Reply Last reply
                    2
                    • L Offline
                      L Offline
                      Laguimauve
                      wrote on last edited by Laguimauve
                      #9

                      @KroMignon said in QFileSystemModel limiter la liste des fichiers suivant le contenu:

                      "[[]???[]]"

                      @KroMignon
                      @SGaist

                      Yes ça fonctionne.
                      J'ai également testé avec des parenthèses comme ceci : "[(]???[)]" et ça fonctionne très bien également.

                      Je vais lire la documentation que tu as référencé.

                      Merci.

                      alt text

                          fileModel = new QFileSystemModel(this);
                          fileModel->setFilter(QDir::NoDotAndDotDot | QDir::Files);
                          fileModel->setRootPath("");
                          fileModel->setNameFilters(QStringList() << "*[[]???[]]*" );
                          fileModel->setNameFilterDisables(false);
                          ui->lvwFiles->setModel(fileModel);
                          ui->lvwFiles->setRootIndex(fileModel->setRootPath(dirDesktopLocation));
                      
                      KroMignonK 1 Reply Last reply
                      0
                      • L Laguimauve

                        @KroMignon said in QFileSystemModel limiter la liste des fichiers suivant le contenu:

                        "[[]???[]]"

                        @KroMignon
                        @SGaist

                        Yes ça fonctionne.
                        J'ai également testé avec des parenthèses comme ceci : "[(]???[)]" et ça fonctionne très bien également.

                        Je vais lire la documentation que tu as référencé.

                        Merci.

                        alt text

                            fileModel = new QFileSystemModel(this);
                            fileModel->setFilter(QDir::NoDotAndDotDot | QDir::Files);
                            fileModel->setRootPath("");
                            fileModel->setNameFilters(QStringList() << "*[[]???[]]*" );
                            fileModel->setNameFilterDisables(false);
                            ui->lvwFiles->setModel(fileModel);
                            ui->lvwFiles->setRootIndex(fileModel->setRootPath(dirDesktopLocation));
                        
                        KroMignonK Offline
                        KroMignonK Offline
                        KroMignon
                        wrote on last edited by KroMignon
                        #10

                        @Laguimauve said in QFileSystemModel limiter la liste des fichiers suivant le contenu:

                        Je vais lire la documentation que tu as référencé.
                        Merci.

                        De rien, n'oublies pas de marquer le sujet comme résolu.
                        ==> C'est toujours une très bonne idée de se prendre le temps de lire la documentation.

                        En fait, ce n'est pas une expression régulière qui est utilisée mais une Glob pattern.

                        Il y a un outil en ligne qui permet de tester un pattern ==> Glob Tool

                        It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                        1 Reply Last reply
                        2

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved