2010-07-04 14 views
6

Bene Sto utilizzando il seguente codice per ottenere il nome del file per un file che deve essere conservato ..Come scoprire quale suffisso utente ha scelto quando si utilizza QFileDialog?

QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),"/home/user/MyDocs/",tr("JPG files (*.jpg);;BMP files (*.bmp);;PNG files (*.png)")); 

sto fornendo all'utente una serie di opzioni per quanto riguarda il formato di file in cui il file deve essere salvato. Tuttavia, il valore restituito QString mi fornisce solo il prefisso nomefile che l'utente ha scelto, non il suffisso e quindi non so quale formato di file l'utente abbia scelto. Come posso rilevare un simile formato di file?

risposta

2

Dai un'occhiata alla discussione this. Utilizza QFileInfo sulla stringa inserita in un QFileDialog.

+0

Sicuramente accetterò una risposta qui una volta ottenuta la risposta di cui ho bisogno .. Uh, anche questo non funziona. QFileInfo funzionerà solo se la stringa è passata (cioè 's' nell'esempio che hai collegato a) contiene un nome file che ha già un suffisso .. per esempio, se la stringa era "file.ext", il suffisso restituirebbe "ext" .. Il mio problema è che il nome file in primo luogo NON ha un suffisso in è .. il fileName che ho ricevuto è come "/ home/utente/MyDocs/nomefile" ... nessun suffisso .. – Ahmad

1

è necessario utilizzare la stringa opzionale 5 °
faccio di solito in questo modo:

#define JPEG_FILES "JPG files (*.jpg)" 
#define BMP_FILES "BMP files (*.bmp)" 
#define PNG_FILES "PNG files (*.png)" 

QString selectedFilter; 
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), 
     "/home/user/MyDocs/", 
     JPEG_FILES ";;" BMP_FILES ";;" PNG_FILES, &selectedFilter); 

if (fileName.isNull()) 
    return; 
if (selectedFilter == JPEG_FILES) { 
    ... 
} else if (selectedFilter == BMP_FILES) { 
    ... 
} else if (selectedFilter == PNG_FILES) { 
    ... 
} else { 
    // something strange happened 
} 

Il compilatore si occupa di concatenare le stringhe letterali nell'argomento.

Non sono sicuro di come la stringa restituita interagisca con tr(). Dovrai testare e scoprire. probabilmente devi annullarlo.
Sarebbe stato meglio se la funzione restituisse l'indice del filtro selezionato ma, ahimè, non lo è.

Una soluzione migliore sarebbe quella di inserire i filtri in un elenco, creare una stringa e confrontarli con la stringa di filtro selezionata restituita con quelli nell'elenco. Ciò risolverebbe anche il problema tr().

+0

Ho appena provato questo e non ha funzionato per me .. il ritorno selectedString è vuoto .. – Ahmad

+0

@Ahmad: tu dici "return selectedString" stai testando 'selectedFilter' dall'esempio qui o' filename'? –

+0

Questo è il codice che stavo usando: QString sf; QString fileName = QFileDialog :: getSaveFileName (questo, tr ("Salva file"), "/ home/utente/MyDocs /", tr ("file JPG (* .jpg) ;; file BMP (* .bmp) ;; File PNG (* .png) "), &sf); sf non contiene nulla dopo che le due righe precedenti sono state eseguite .. è vuoto .. – Ahmad

1

Il codice nella domanda funziona in Windows (Qt 4.6.2 e Win XP). fileName contiene l'estensione selezionata. Ma, ovviamente, si sta utilizzando un'altra cosa di Windows, quindi si potrebbe provare questa soluzione:

QFileDialog dialog(this, tr("Save as ..."), "/home/user/MyDocs/"); 
dialog.setAcceptMode(QFileDialog::AcceptSave); 
QStringList filters; 
filters << "JPG files (*.jpg)" << "BMP files (*.bmp)" << "PNG files (*.png)"; 
dialog.setNameFilters(filters); 
if (dialog.exec() == QDialog::Accepted) 
{ 
    QString selectedFilter = dialog.selectedNameFilter(); 
    QString fileName = dialog.selectedFiles()[0]; 
} 

Questo è un codice leggermente modificato da here.

+0

Questo non fa lo stesso del codice OPs. apre la finestra di dialogo dei file QT invece della finestra di dialogo dei file delle piattaforme. – shoosh

+0

Grazie per questo esempio. Era la risposta al mio problema ... ma ho una piccola domanda di follow-up. Il dialog.selectedNameFilter() restituirebbe "qualcosa (* .ext)", c'è un modo per ottenere semplicemente .ext? Quindi posso aggiungerlo al file se l'utente non l'ha fatto? – Dariusz