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 - fauxDans 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.
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é maisQRegularExpression::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.
-
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é maisQRegularExpression::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:
"[[]???[]]"
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.
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