2011-02-03 18 views
5

Vorrei filtrare i file mostrati in un QFileDialog in modo più specifico delle sole estensioni di file. Gli esempi che ho trovato nella documentazione di Qt mostrano solo filtri come Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml) e così via. In aggiunta a questo vorrei anche specificare un filtro per i file che dovrebbe non mostrare nella finestra di dialogo del file, ad es. XML files (*.xml) ma non Backup XML files (*.backup.xml).Filtraggio in QFileDialog

Quindi il problema che ho è che mi piacerebbe mostrare alcuni file nella finestra di dialogo che hanno determinate estensioni di file, ma non vorrei mostrare altri file con un suffisso specifico per il nome del file (e la stessa estensione di file) .

Ad esempio:

File da mostrare:

file1.xml 
file2.xml 

file non mostrare:

file1.backup.xml 
file2.backup.xml 

Vorrei chiedere se è possibile definire filtri come questi per un QFileDialog?

risposta

9

Credo che ciò che si può fare è:

  1. creare un modello di proxy personalizzato. Puoi usare QSortFilterProxyModel come classe base per il tuo modello;
  2. Nel modello proxy sovrascrivere il metodo filterAcceptsRow e restituire false per i file che hanno lo ".backup". parola nel loro nome;
  3. Imposta il nuovo modello proxy nella finestra di dialogo del file: QFileDialog::setProxyModel;

Di seguito è riportato un esempio:

modello Proxy:

class FileFilterProxyModel : public QSortFilterProxyModel 
{ 
protected: 
    virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; 
}; 

bool FileFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const 
{ 
    QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent); 
    QFileSystemModel* fileModel = qobject_cast<QFileSystemModel*>(sourceModel()); 
    return fileModel->fileName(index0).indexOf(".backup.") < 0; 
    // uncomment to call the default implementation 
    //return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); 
} 

dialogo è stato creato in questo modo:

QFileDialog dialog; 
dialog.setProxyModel(new FileFilterProxyModel); 
dialog.setNameFilter("XML (*.xml)"); 
dialog.setOption(QFileDialog::DontUseNativeDialog); 
dialog.exec(); 

Il modello proxy è supportata solo da finestre di dialogo file non nativi .

0

Ok, l'ho usato con QFileDialog oggetto. E questo mi mostra solo i file elencati nella directory appropriata. È eccellente scegliere solo i file da elaborare. Ad esempio, un file XML, un'immagine PNG, eccetera.

Qui presento il mio esempio

OlFileDialog QFileDialog (this); 
QString slFileName; 
olFileDialog.setNameFilter (tr ("Files (* xml)")); 
olFileDialog.setFileMode (QFileDialog :: anyfile); 
olFileDialog.setViewMode (QFileDialog :: Detail); 
if (olFileDialog.exec()) 
    olFileDialog.selectFile (slFileName); 
else 
    return; 

la finestra di dialogo visualizzerà presenta solo i file XML.

0

La soluzione di @serge_gubenko funziona correttamente. Crea il tuo ProxyModel ereditando dallo QSortFilterProxyModel.

class FileFilterProxyModel : public QSortFilterProxyModel 
{ 
protected: 
    virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; 
}; 

bool FileFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const 
{ 
    // Your custom acceptance condition 
    return true; 
} 

Basta fare in modo di impostare DontUseNativeDialogprima impostare il modello Proxy (non il modo in cui lo ha fatto @serge_gubenko).Le finestre di dialogo native non supportano i messaggi personalizzati ProxyModel s.

QFileDialog dialog; 
dialog.setOption(QFileDialog::DontUseNativeDialog); 
dialog.setProxyModel(new FileFilterProxyModel); 
dialog.setNameFilter("XML (*.xml)"); 
dialog.exec(); 

Mi ci è voluto un po 'di tempo per scoprirlo. Questo è stato scritto here

+0

Questo non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (https://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (https://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/18085257) –