2010-07-04 7 views
6

Bueno, yo estoy usando el siguiente código para obtener el nombre de archivo para un archivo que necesita ser almacenado ..¿Cómo puedo saber qué sufijo ha elegido el usuario al usar QFileDialog?

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

estoy proporcionando al usuario una serie de opciones en cuanto al formato de archivo en el que el archivo es para ser salvado Sin embargo, el QString devuelto solo me da el nombre de archivo de prefijo que el usuario ha elegido, no el sufijo y, por lo tanto, no sé qué formato de archivo eligió el usuario. ¿Cómo puedo detectar dicho formato de archivo?

Respuesta

2

Eche un vistazo a this discusión. Utiliza QFileInfo en la cadena que se ingresó en QFileDialog.

+0

Seguro, voy a aceptar una respuesta aquí una vez que obtenga la respuesta que necesito ... Uh, esto no está funcionando también ... QFileInfo solo funcionará si la cadena pasó a la misma (es decir, 's' en el ejemplo que enlazó to) contiene un nombre de archivo que ya tiene un sufijo ... por ejemplo, si la cadena fue "file.ext", el sufijo devolvería "ext". Mi problema es que el nombre de archivo en primer lugar NO tiene un sufijo en Es .. Es decir, el FileName que recibo viene como "/ home/user/MyDocs/filename" ... sin sufijo ... – Ahmad

1

Es necesario utilizar la quinta cadena opcional
que suele hacer así:

#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 
} 

El compilador se encarga de concatenar las cadenas literales en el argumento.

No estoy seguro de cómo la cadena devuelta interactúa con tr(). Tendrás que probar y descubrir. probablemente necesite destraducirlo.
Podría haber sido mejor si la función devolverá el índice del filtro seleccionado, pero desafortunadamente no es así.

Una mejor solución sería poner los filtros en una lista, crear una cadena a partir de ella y luego compararla con la cadena de filtro seleccionada devuelta a las de la lista. Esto también resolvería el problema tr().

+0

Lo probé y no funcionó para mí ... el selectedString que regresa está vacío .. – Ahmad

+0

@Ahmad: dices "regresar selectedString" estás probando 'selectedFilter' del ejemplo aquí o' filename'? –

+0

Este es el código que estaba usando: QString sf; QString fileName = QFileDialog :: getSaveFileName (this, tr ("Guardar archivo"), "/ home/usuario/MyDocs /", tr ("Archivos JPG (* .jpg) ;; Archivos BMP (* .bmp) ;; PNG files (* .png) "), &sf); sf no contiene nada después de que se hayan ejecutado las dos líneas anteriores. Está vacío. – Ahmad

1

El código en la pregunta funciona en Windows (Qt 4.6.2 y Win XP). fileName contiene la extensión seleccionada. Pero, obviamente, que está utilizando algo más de Windows, lo que podría intentar esta solución:

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]; 
} 

Eso es un código levemente modificado de here.

+0

Esto no hace lo mismo que el código OPs. abre el cuadro de diálogo QTs file en lugar del cuadro de diálogo de archivo de plataformas. – shoosh

+0

Gracias por este ejemplo. Fue la respuesta para mi problema ... pero tengo una pequeña pregunta de seguimiento. El cuadro de diálogo.selectedNameFilter() devolvería "something (* .ext)", ¿hay alguna forma de obtener el .ext? Entonces, ¿puedo agregarlo al archivo si el usuario no lo hizo? – Dariusz

Cuestiones relacionadas