2011-02-03 20 views
5

Me gustaría filtrar los archivos que se muestran en un QFileDialog más específicamente que solo por extensiones de archivo. Los ejemplos que encontré en la documentación de Qt solo muestran filtros como Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml) y tal. Además de esto, también me gustaría especificar un filtro para los archivos que deberían no aparecer en el cuadro de diálogo del archivo, p. XML files (*.xml) pero no Backup XML files (*.backup.xml).Filtrado en QFileDialog

Así que el problema que tengo es que me gustaría mostrar algunos archivos en el diálogo de archivos que tienen cierta extensión de archivo, pero no me gustaría mostrar otros archivos con un sufijo de nombre de archivo específico (y la misma extensión de archivo) .

Por ejemplo:

archivos para mostrar:

file1.xml 
file2.xml 

archivos no mostrar:

file1.backup.xml 
file2.backup.xml 

quisiera preguntar si es posible definir filtros como estos para una QFileDialog?

Respuesta

9

creo que lo que puede hacer es:

  1. crear un modelo de proxy personalizado. Puede usar QSortFilterProxyModel como una clase base para su modelo;
  2. En el modelo de proxy, anule el método filterAcceptsRow y devuelva falso para los archivos que tienen ".backup". palabra en sus nombres;
  3. Establezca un nuevo modelo de proxy en el cuadro de diálogo de archivo: QFileDialog::setProxyModel;

A continuación se muestra un ejemplo:

modelo de 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); 
} 

de diálogo fue creado de esta manera:

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

El modelo de poder se apoya en los diálogos de archivo no nativos sólo .

0

Bien, lo he usado con objeto QFileDialog. Y esto solo me muestra los archivos enumerados en el directorio apropiado. Es excelente simplemente elegir los archivos que se procesarán. Por ejemplo, un archivo XML, una imagen PNG, etcétera.

Aquí presento mi ejemplo

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; 

El cuadro de diálogo mostrará solamente presenta los archivos XML.

0

La solución de @serge_gubenko está funcionando bien. Cree su propio ProxyModel heredando del 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; 
} 

Sólo asegúrese de establecer DontUseNativeDialogantes establecer el modelo de proxy (no de la manera que lo hizo @serge_gubenko).Los cuadros de diálogo nativos no son compatibles con ProxyModel s personalizados.

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

Me llevó algo de tiempo encontrarlo. Esto fue escrito here

+0

Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente [reputación] (https://stackoverflow.com/help/whats-reputation) podrá [comentar cualquier publicación] (https://stackoverflow.com/help/privileges/comment); en su lugar, [brinde respuestas que no requieran aclaración del autor de la pregunta] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-instead). - [De la crítica] (/ reseña/mensajes de baja calidad/18085257) –