|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
![]() ![]() |
Bonjour,
Je bloque depuis plus d'une semaine sur un petit bug. J'ai un QTreeView qui affiche des dossiers et lorsqu'on double-clique sur un dossier, la liste des fichiers contenu dans celui-ci s'affiche dans un QListView. Malheureusement, il n'affiche pas uniquement les fichiers mais aussi les dossiers déjà parcourus contenu dans le dossier sélectionné. Exemple : je vais dans /home, /cdrom puis je reviens dans / et /home et /cdrom s'affichent dans le QListView alors qu'ils ne devraient pas malgrès la présence d'un : modelFile.setFilter( QDir::Files); sur le modèle. Voici mon code minimal : Code main.cpp :
Code mainwindows.h :
Code mainwindows.cpp :
Code mainwindows.ui :
NB : J'utilise Qt Creator 2.4.1 Basé sur Qt 4.8.0 (64 bit) sous Ubuntu LTS 12.04.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon. Chaîne Youtube : Vidéos Ma page DVP : http://neckara.developpez.com/ |
||||||||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() ![]() Alexandre LaurentIngénieur développement logiciels Inscription : mai 2008 Messages : 10 467 ![]() |
Bonjour,
Ne suffit-il pas de vider la liste (le modèle) avant de continuer à la remplir ?
__________________
Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi ![]() La rubrique a aussi un blog ! Ma page sur DVP Mon Portfolio Qui connaît l'erreur, connaît la solution. |
|
00
|
|
|
#3 |
![]() ![]() |
Bonjour,
Merci pour ton aide mais malheureusement ta solution ne marche pas. J'ai mis : Code :
modelFile.removeRows(0 , modelFile.rowCount() );
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon. Chaîne Youtube : Vidéos Ma page DVP : http://neckara.developpez.com/ |
|
|
00
|
|
|
#4 |
![]() ![]() |
Salut,
Et si, au lieu d'avoir un modèle comme membre, tu en faisais une variable locale, qui serait donc détruite à chaque fois que tu sors de la fonction Au moins, tu serais sur de partir sur un model dans lequel il ne reste aucune "crasse" Si cela ne suffit pas, tu pourrais toujours tenter de forcer l'appel à update() en passant le modèleindex adéquat
__________________
en bas de page
|
|
|
10
|
|
|
#5 | ||||||
![]() ![]() |
Citation:
Code :
Citation:
Code :
Merci pour tes idées.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon. Chaîne Youtube : Vidéos Ma page DVP : http://neckara.developpez.com/ |
||||||
|
|
00
|
|
|
#6 | |||
![]() ![]() |
Citation:
Au lieu d'utiliser une variable locale, détruite à la fin de la fonction vidant alors le QListView, j'utilise une variable allouée avec new que je détruit et reconstruit à chaque appel de la fonction ![]() Code :
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon. Chaîne Youtube : Vidéos Ma page DVP : http://neckara.developpez.com/ |
|||
|
|
00
|
|
|
#7 |
|
Membre éprouvé
![]() Saâd HessaneIngénieur développement logiciels Inscription : avril 2008 Messages : 302 ![]() |
Je ne sais pas si ton problème est résolue. Effectivement le model est recréé, mais il il y a quelque chose qui cloche.
Le fait que le modèle affiche des dossiers bien que les filtres soit activer me perturbe. Mais après lecture de la doc et une petite relecture du code de la classe QFileSystemModel, j'ai peut être un début de réponse. QFileSystemModel utilise QFileSystemWatcher pour surveiller les modifications dans le système de fichier. Quand tu fais setRootPath(path), ce path est ajouté à l'objet QFileSystemWatcher. Quand tu remontes l'arborescence, l'objet QFileSystemWatcher surveille les fichiers du dossier actuel, mais aussi les fichiers du dossier d'avant. Mais vu que tu affiches le model dans une qlistview, il n'affiche que le premier niveau : les fichiers du dossier courant, et les dossiers contenant des fichiers qui ont été ajouter au QFileSystemWatcher. Tu peux t'en rendre compte en remplaçant la QListView par une QTreeView. C'est pas facile à expliquer, j’essaierai d'aller plus loin dans les tests ce soir pour confirmer mon hypothèse. |
|
|
10
|
|
|
#8 | ||
![]() ![]() |
Si je comprend bien :
Je suis dans / : Il surveille alors les fichiers contenus dans / ainsi que / au cas où d'autres fichiers seraient ajoutés. Fichiers surveillés : Je vais dans /home : Il surveille en plus des fichiers précedants les fichiers contenus dans /home ainsi que /home au cas où d'autres fichiers seraient ajoutés. Fichiers surveillés : Code :
C'est donc un bug de Qt ? Il faudrait donc chercher un moyen de vider le QFileSystemWatcher avant de changer le dossier où on va.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon. Chaîne Youtube : Vidéos Ma page DVP : http://neckara.developpez.com/ |
||
|
|
00
|
|
|
#9 | ||||
|
Membre éprouvé
![]() Saâd HessaneIngénieur développement logiciels Inscription : avril 2008 Messages : 302 ![]() |
Citation:
Citation:
Pour l'instant ça n'est qu'une hypothèse, je parle de problème et ne veux pas m'avancer à dire que c'est un bug. Le problème apparaît sur Windows 64bits avec Qt 4.8, et Debian avec Qt 4.4 dans mon cas. QFileSystemModel utilise QFileSystemWatcher à la fois comme un cache de données et pour garder le modèle cohérent avec le système de fichiers. Tu n'y as malheureusement (ou heureusement) pas accès. |
||||
|
|
00
|
|
|
#10 | ||
|
Membre éprouvé
![]() Saâd HessaneIngénieur développement logiciels Inscription : avril 2008 Messages : 302 ![]() |
Pas besoin de confirmation. C'est un problème connue. Plusieurs tickets sont créés pour rapporter le problème. L'un d'eux :
[EDIT]https://bugreports.qt-project.org/browse/QTBUG-9811 Une solution serait de faire : Code C++ :
|
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com