Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QFileSystemModel limiter la liste des fichiers suivant le contenu



  • 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.



  • @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?



  • @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);
    ...
    


  • @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.


  • Lifetime Qt Champion

    Bonsoir,

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

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



  • @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,



  • @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));
    


  • @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.



  • @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?



  • @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));
    


  • @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


Log in to reply