2010-07-04 139 views
6

嗯,我用下面的代碼來獲取需要被存儲在一個文件的文件名..如何知道使用QFileDialog時用戶選擇了哪個後綴?

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

我給用戶提供多種選擇有關文件格式,其中文件將被保存。但是,返回的QString只給出用戶選擇的前綴文件名,而不是後綴,因此我不知道用戶選擇了哪種文件格式。我如何檢測這種文件格式?

回答

2

看看this的討論。它在輸入QFileDialog的字符串上使用QFileInfo

+0

確定我會在這裏接受一個答案,一旦我得到我需要的答案..呃,這不是太工作.. QFileInfo只會工作,如果字符串傳遞給它(即's'在你鏈接的例子中to)包含一個已經有後綴的文件名..例如,如果字符串是「file.ext」,後綴將返回「ext」..我的問題是文件名在第一個地方沒有後綴它..也就是說,我得到的文件名是像「/家庭/用戶/ MyDocs /文件名」...沒有後綴.. – Ahmad 2010-07-04 15:58:48

1

您需要使用5可選字符串
我通常不喜歡這樣:

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

編譯器負責來串聯文本字符串中的參數。

我不確定返回的字符串如何與tr()進行交互。你必須測試並找出答案。可能需要解開它。
如果該函數返回所選過濾器的索引,但它可能會更好,但它不會。

一個更好的解決方案是將過濾器放在一個列表中,從中創建一個字符串,然後將返回的選定過濾器字符串與列表中的字符串進行比較。這也將解決tr()問題。

+0

我只是試過這個,它並沒有爲我工作..返回的selectedString是空的.. – Ahmad 2010-07-04 15:53:56

+0

@Ahmad:你說「返回selectedString」是你測試'selectedFilter'從這裏的例子或'filename'? – 2010-07-04 16:31:23

+0

這是我正在使用的代碼: QString sf; QString fileName = QFileDialog :: getSaveFileName(this,tr(「Save File」),「/ home/user/MyDocs /」,tr(「JPG files(* .jpg);; BMP files(* .bmp);; PNG文件(* .png)「),&sf); 在上述兩行執行後sf不包含任何內容..其空格。 – Ahmad 2010-07-04 16:37:44

1

問題中的代碼在Windows(Qt 4.6.2和Win XP)中工作。 fileName包含選定的擴展名。但你顯然用別的東西的Windows,所以你可以嘗試以下解決方法:

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

也就是說從here略爲修改後的代碼。

+0

這與OPs代碼不一樣。它會打開QTs文件對話框而不是平臺文件對話框。 – shoosh 2010-07-04 23:15:32

+0

謝謝你的這個例子。這是我的問題的答案...但我有一點後續問題。 dialog.selectedNameFilter()會返回「something(* .ext)」,有沒有辦法只是得到.ext?那麼如果用戶沒有,我可以將它添加到文件中? – Dariusz 2017-07-18 09:38:42

相關問題