2010-07-04 27 views
6

Dobrze używam następujący kod, aby uzyskać nazwę pliku dla pliku, który musi być przechowywany ..Jak mogę się dowiedzieć, który sufiks został wybrany przez użytkownika przy użyciu QFileDialog?

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

jestem dostarczając użytkownikowi szereg opcji dotyczących formatu pliku, w którym plik ma być zbawiony. Jednak zwrócony QString tylko daje mi przedrostek nazwy pliku, który wybrał użytkownik, a nie sufiks i dlatego nie wiem, który format pliku wybrał użytkownik. Jak mogę wykryć taki format pliku?

Odpowiedz

2

Zajrzyj do dyskusji na temat this. Używa ona QFileInfo w ciągu znaków, który został wprowadzony w QFileDialog.

+0

Na pewno przyjmuję odpowiedź tutaj, gdy otrzymam odpowiedź, której potrzebuję ... Uh, to też nie działa. QFileInfo zadziała tylko wtedy, gdy przeciągnięty do niego ciąg znaków (a mianowicie "s" w przykładzie, który podłączyłeś to) zawiera nazwę pliku, która ma już przyrostek. Na przykład, jeśli string był "file.ext", sufiks zwróciłby "ext". Mój problem polega na tym, że nazwa pliku w ogóle NIE zawiera sufiksu to znaczy, że nazwa pliku pojawia się jak "/ home/user/MyDocs/filename" ... brak sufiksu .. – Ahmad

1

Musisz użyć opcjonalnego 5th ciąg
zwykle zrobić to tak:

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

Kompilator dba aby złączyć dosłowne ciągi w argumencie.

Nie jestem pewien, w jaki sposób zwracany ciąg wchodzi w interakcję z tr(). Musisz przetestować i dowiedzieć się. prawdopodobnie trzeba to przetłumaczyć.
Mogłoby być ładniej, gdyby funkcja zwróciła indeks wybranego filtra, ale niestety, nie.

Ładniejszym rozwiązaniem byłoby umieszczenie filtrów na liście, utworzenie z nich ciągu znaków, a następnie porównanie z wybranym wybranym filtrem z tymi na liście. Rozwiązałoby to również problem z tr().

+0

Po prostu próbowałem tego i to nie działało dla mnie .. Zwracany selectedString jest pusty .. – Ahmad

+0

@Ahmad: mówisz "zwracanie selectedString" czy testujesz 'selectedFilter' z przykładu tutaj lub' filename'? –

+0

To jest kod, którego używałem: QString sf; QString fileName = QFileDialog :: getSaveFileName (to, tr ("Zapisz plik"), "/ home/user/MyDocs /", tr ("Pliki JPG (* .jpg) ;; pliki BMP (* .bmp) ;; Pliki PNG (* .png) "), &sf); sf nic nie zawiera po wykonaniu powyższych dwóch linii .. jego puste .. – Ahmad

1

Kod w pytaniu działa w systemie Windows (Qt 4.6.2 i Win XP). fileName zawiera wybrane rozszerzenie. Ale są oczywiście używając coś innego systemu Windows, więc można spróbować tego obejścia:

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

To Slighty zmodyfikowany kod z here.

+0

To nie robi tego samego, co kod OP. otwiera okno dialogowe pliku QTs zamiast okna dialogowego plików platformy. – shoosh

+0

Dziękuję za ten przykład. To była odpowiedź na mój problem ... ale mam małe pytanie. Funkcja dialog.selectedNameFilter() zwróciłaby "coś (* .ext)", czy istnieje sposób na uzyskanie .ext? Czy mogę dodać go do pliku, jeśli użytkownik tego nie zrobił? – Dariusz