2010-09-01 29 views
5

Les utilisateurs ouvrent des fichiers dans notre application via un QFileDialog. L'ordre des noms de fichiers est bizarre. Qu'est-ce qui détermine l'ordre de tri, et comment pouvons-nous le trier par noms de fichiers, ou sinon imposer notre propre tri, en lui donnant peut-être un pointeur vers notre propre fonction de comparaison?Qu'est ce qui détermine le tri des fichiers dans un QFileDialog?

La documentation et les forums en ligne n'ont pas été utiles. À moins qu'il ne soit bien caché, il ne semble pas y avoir de méthode de tri, de propriété, etc.

Il s'agit d'une application principalement Linux, mais fonctionne également sur Mac. (Je ne sais rien à propos de Mac.)

Voici la partie juteuse du code source:

QtFileDialog chooser(parent, caption, directory, filter); 
/// QtFileDialog is our class derived from QFileDialog 

chooser.setModal(true); 
chooser.setAcceptMode(acceptMode); 
chooser.setFileMode(fileMode); 

QStringList hist = chooser.history(); 
chooser.setHistory(hist); 

/* point "x" */ 

if(chooser.exec()) {  
    QStringList files = chooser.selectedFiles(); 
    ...blah blah blah... 

A partir de l'une des réponses, j'ai essayé une expérience mal, en ajoutant ce code devinettes mal informé au " point x ":

QSortFilterProxyModel *sorter = new QSortFilterProxyModel(); 
sorter->sort(1); // ??? 
chooser.setProxyModel(sorter); 

Mais spectaculairement chuté à un point environ 33 sous-programme appelle en profondeur de ce niveau de code. J'avoue, même après avoir lu la documentation Qt4 et l'exemple de code, je n'ai aucune idée de l'utilisation correcte de QSortFilterProxyModel.

Répondre

4

UTILISIEZ QFileDialog vous en appelant exec()? Si c'est le cas, vous devez avoir un bouton pour basculer l'affichage sur Affichage détaillé. Cela vous donnera des en-têtes de colonne sur lesquels vous pouvez cliquer pour trier les fichiers. Il doit se souvenir de ce mode la prochaine fois que la boîte de dialogue s'ouvre, mais vous pouvez la forcer en appelant le setViewMode(QFileDialog::Detail) avant d'appeler le exec().

Une alternative consiste à appeler la fonction statique QFileDialog::getOpenFileName() qui ouvrira une boîte de dialogue de fichier native au système d'exploitation sur lequel vous exécutez. Vos utilisateurs peuvent préférer la familiarité de cette option.

Mise à jour 1:

A propos de l'ordre de tri dans le capuchon de l'écran de l'OP: alt text

Cette capture d'écran montre en fait une liste triée. Je ne sais pas si le comportement de la liste provient de la boîte de dialogue Qt ou du système de fichiers sous-jacent, mais je connais Windows XP et plus tard, je le fais de cette façon.

Lorsque vous triez des noms de fichiers avec des numéros incorporés, toutes les suites de chiffres consécutifs sont traitées comme un nombre unique. Avec plus de tri de chaîne simple classique, les fichiers seraient classés comme ceci:

A_A_10e0 
A_A_9a05 

caractère Going par caractère, les premiers 1 sortes avant le 9.

..Mais l'interprétation numérique (comme dans Windows 7 au moins), ils sont classés comme:

A_A_9a05 
A_A_10e0 

Les 9 sortes avant le 10.

Ainsi, le tri vous voyez est alphabétique avec interprétation numérique et non Juste un caractère direct par caractère. Certains creusements profonds peuvent être nécessaires pour voir si c'est un comportement Qt ou un comportement du système d'exploitation et si oui ou non il peut être configuré.

Mise à jour 2:

Le QSortFilterProxyModel triera les chaînes par ordre alphabétique par défaut donc il n'y a pas beaucoup de travail à utiliser pour obtenir le comportement que vous recherchez. Utilisez le code suivant où vous avez « point x » dans votre exemple .. (vous l'aviez presque :)

QSortFilterProxyModel *sorter = new QSortFilterProxyModel(); 
sorter->setDynamicSortFilter(true); // This ensures the proxy will resort when the model changes 
chooser.setProxyModel(sorter); 
+0

Peut-être, c'est la chose à faire. Nous en discuterons. Idéalement, nous aimerions que la boîte de dialogue apparaisse comme vous le souhaitez sans avoir à cliquer sur quoi que ce soit. – DarenW

+0

Quelle version de Qt 4 utilisez-vous? J'ai vu un bogue mentionné pour QFileDialog sous Linux qui conduisait au tri des fichiers basé sur le nom et l'extension. Pouvez-vous montrer un exemple du comportement de tri que vous voyez? –

+0

Qt4.3, je pense. Plusieurs versions sont installées pour prendre en charge une grande variété de logiciels ici. Un exemple de capture d'écran: http://www.aoc.nrao.edu/~dwilson/temp/goofysort3.png – DarenW

2

Je pense que ce que vous devez faire est de créer un QSortFilterProxyModel que vous définissez ensuite dans votre QFileDialog avec QFileDialog :: setProxyModel (QAbstractProxyModel * proxyModel)

Voici quelques liens pertinents vers Qt 4.6 docs à son sujet.

http://doc.trolltech.com/4.6/qfiledialog.html#setProxyModel

http://doc.trolltech.com/4.6/qsortfilterproxymodel.html#details

+0

Yikes! On dirait une boîte de vers compliquée que je préférerais éviter. – DarenW

+0

Existe-t-il un exemple simple et clair d'utilisation de QSortFilterProxyModel avec une boîte de dialogue d'ouverture de fichier? Les seuls exemples que je vois sont en train d'utiliser une sorte de liste d'arbres, dont on ne se soucie pas. C'est comme si c'était la seule façon pour nous de prendre le contrôle du tri. – DarenW

0

Je ne pense pas que cela dépend de la mise en œuvre des bibliothèques Qt ... Mais sur la maternelle OS .. mise en œuvre

par exemple dans Windows,

si vous utilisez QFileDialog, il affiche les fichiers et répertoires par Name triés .. il est la même que celle utilisée dans d'autres applications. En ce sens que, si vous essayez d'ouvrir un fichier via MS- Word, il affiche en effet les fichiers et répertoires comme Namepar défaut triés ..

Et je ne suis pas sûr d'autres environnements puisque je ne suis pas utilisé pour les .. Mais dans Windows, vous pouvez changer l'ordre trié en faisant un clic droit dans la zone de l'écran Fichiers et répertoires et sélectionner les options que vous voulez. Par exemple Nom, taille, type, .. Et aussi ce qui est similaire, lorsque vous utilisez une application MS-Word ...

Donc, je crois que cela dépend de l'implémentation du système d'exploitation natif et non de QFileDialog ...

+0

Nous développons sur linux + Mac seulement – DarenW