2010-09-01 8 views
5

Gli utenti aprono i file nella nostra app tramite un QFileDialog. L'ordine dei nomi dei file è bizzarro. Che cosa determina l'ordinamento e come possiamo ordinarlo per nome di file, o altrimenti imporre il nostro ordinamento, magari dandogli un puntatore alla nostra funzione di confronto?Che cosa determina l'ordinamento dei file in un QFileDialog?

La documentazione e i forum online non sono stati utili. A meno che non sia ben nascosto, non sembra esserci alcun metodo di ordinamento, proprietà, ecc.

Questa è principalmente un'app per Linux, ma funziona anche su Mac. (Non so niente di Mac.)

Qui è la parte succosa del codice sorgente:

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

Da una delle risposte, ho provato un esperimento male, aggiungendo questo codice congetture male informati al " punto x ":

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

Ma questo è schiantato spettacolare in un punto circa 33 subroutine chiama profondo da questo livello di codice. Ammetto che, anche dopo aver letto la documentazione Qt4 e il codice di esempio, non ho idea del corretto utilizzo di QSortFilterProxyModel.

risposta

4

Stai usando QFileDialog chiamando exec()? Se lo sei, dovresti avere un pulsante per cambiare la vista in Visualizzazione dettagliata. Questo ti darà alcune intestazioni di colonna su cui puoi cliccare per ordinare i file. Dovrebbe ricordare questa modalità la prossima volta che si apre la finestra di dialogo, ma puoi forzarla chiamando lo setViewMode(QFileDialog::Detail) prima di chiamare exec().

Un'alternativa è chiamare la funzione statica QFileDialog::getOpenFileName() che aprirà una finestra di dialogo file che è nativa del sistema operativo su cui si sta eseguendo. I tuoi utenti potrebbero apprezzare la familiarità di questa opzione.

Update 1:

A proposito di ordinamento in cap schermo da OP: alt text

cattura Questa schermata è in realtà mostrando un elenco ordinato. Non so se il comportamento dell'elenco proviene dalla finestra di dialogo Qt o dal file system sottostante, ma conosco Windows XP e successivamente lo faccio in questo modo.

Quando si ordinano nomi di file con numeri incorporati, qualsiasi numero di cifre consecutive viene considerato come un numero singolo. Con il più classico ordinamento stringa di pianura, i file sarebbero stati ordinati in questo modo:

A_A_10e0 
A_A_9a05 

Andando carattere per carattere, il primo 1 sorta prima del 9.

..Ma con l'interpretazione numerica (come in Windows 7, almeno), essi sono ordinati come:

A_A_9a05 
A_A_10e0 

Le 9 sorta prima del 10.

Così, la selezione che state vedendo è alfabetico con l'interpretazione numerica e non Semplicemente carattere per carattere. Potrebbero essere necessari alcuni scavi profondi per vedere se questo è il comportamento Qt o il comportamento del sistema operativo e se può essere configurato o meno.

Aggiornamento 2:

Il QSortFilterProxyModel ordinerà le stringhe in ordine alfabetico per impostazione predefinita, quindi non c'è molto lavoro di usarlo per ottenere il comportamento che si sta cercando. Utilizzare il seguente codice in cui si dispone di "punto x" nel tuo esempio .. (quasi avuta :)

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

Forse, questa è la cosa da fare. Ne discuteremo. Idealmente, vorremmo che la finestra di dialogo mostrasse il modo in cui gli utenti vogliono senza dover fare clic su nulla. – DarenW

+0

Quale versione di Qt 4 stai usando? Ho visto un bug menzionato per QFileDialog sotto Linux che porta all'ordinamento dei file in base al nome e all'estensione. Puoi mostrare un esempio del comportamento di ordinamento che stai vedendo? –

+0

Qt4.3, penso. Più versioni sono installate per supportare un'ampia varietà di software qui. Un esempio di schermata di esempio: http://www.aoc.nrao.edu/~dwilson/temp/goofysort3.png – DarenW

2

Penso che quello che dovete fare è creare un QSortFilterProxyModel che poi impostato nel vostro QFileDialog con QFileDialog :: setProxyModel (QAbstractProxyModel * proxyModel)

Ecco alcuni link relativi alle Qt 4.6 documentazione su di esso.

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

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

+0

Yikes! Sembra una lattina di vermi complicati che preferirei evitare. – DarenW

+0

Esiste un chiaro esempio di utilizzo di QSortFilterProxyModel con una finestra di dialogo di apertura file? Gli unici esempi che vedo stanno usando una specie di lista degli alberi che non ci interessa. Sembra che questo sia l'unico modo per noi di assumere il controllo dell'ordinamento. – DarenW

0

Non credo che dipende dalla realizzazione di Qt librerie ... Ma sul Native implementazione del sistema operativo ..

Per esempio in Windows,

se si utilizza QFileDialog, verrà visualizzato il file e directory da Name ordinato .. e 'lo stesso quando usato in altre applicazioni. Nel senso che, se si tenta di aprire un file attraverso MS- Word, visualizza infatti il ​​file e le directory come Name ordinati di default ..

E non sono sicuro di altri ambienti dal momento che non sono abituato a loro ..

Ma in Windows, è possibile modificare l'ordine ordinato facendo clic con il tasto destro nell'area di visualizzazione File e directory e selezionare le opzioni che ti piacciono .. Ad esempio Nome, dimensione, tipo, modificato .. E anche che è simile, quando si utilizza un'applicazione MS-Word ...

Quindi, credo che dipenda dall'implementazione del sistema operativo nativo e non dal numero QFileDialog ...

+0

Stiamo sviluppando solo su linux + Mac – DarenW