2010-01-20 13 views
7

1) Quiero obtener el nombre de la carpeta para una aplicación de supervisión de carpetas .. ¿Existe alguna manera de filtrar las carpetas específicas para que no se muestren con QFileDialog? (Por ejemplo, no quiero que mis documentos sean se muestra en el cuadro de diálogo de archivos) ..qfiledialog - Filtrando carpetas?

2) No deseo que el usuario seleccione una unidad. De forma predeterminada en unidades también se pueden seleccionar este código ..

dirname=QtGui.QFileDialog.getExistingDirectory(self,'Open Directory','c:\\',QtGui.QFileDialog.ShowDirsOnly) 
print(dirname) 

¿Hay una manera que yo puedo mostrar en gris las unidades o algunas carpetas específicas de manera que no se puede seleccionar o puedo configurar los filtros de carpeta para evitar que se muestre ...

Respuesta

1

Puede probar el uso del filtro QDir.Dirs.

dialog = QtGui.QFileDialog(parentWidget) 

dialog.setFilter(QDir.Dirs) 
+0

Gracias apto por su respuesta. Pero enumerará todos los directorios ... Aquí quiero enumerar solo los directorios patriculares ... El código anterior también hace lo mismo ... Mi pregunta es Como filtro de extensión de archivo ¿hay algún filtro para directorios? Y una pregunta más es la forma en que se puede desactivar el "botón Aceptar en qfiledialog" cuando el usuario selecciona un directorio patricular. – Jeba

8

Puede intentar establecer un modelo de proxy para su diálogo de archivo: QFileDialog::setProxyModel. En la clase de modelo de proxy, anule el método filterAcceptsRow y devuelva falso para las carpetas que no desea que se muestren. A continuación se muestra un ejemplo de cómo puede verse el modelo proxy; it'c C++, avíseme si hay algún problema al convertir este código a python. Este modelo se supone que filtrar los archivos y mostrar sólo las carpetas:

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()); 

    if (fileModel!=NULL && fileModel->isDir(index0)) 
    { 
     qDebug() << fileModel->fileName(index0); 
     return true; 
    } 
    else 
     return false; 
    // uncomment to execute default implementation 
    //return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); 
} 

aquí es como me estaba llamando que

QFileDialog dialog; 
FileFilterProxyModel* proxyModel = new FileFilterProxyModel; 
dialog.setProxyModel(proxyModel); 
dialog.setOption(QFileDialog::DontUseNativeDialog); 
dialog.exec(); 

Tenga en cuenta que el modelo de poder es apoyado por sólo los diálogos de archivo no nativo.

1

serge_gubenko le dio la respuesta correcta. Solo tenía que verificar los nombres de las carpetas y devolver "falso" para los que no deberían mostrarse. Por ejemplo, para filtrar las carpetas con el nombre "privado" se escribiría:

bool FileFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const 
{ 
    QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent); 
    QFileSystemModel* fileModel = qobject_cast<QFileSystemModel*>(sourceModel()); 

    if (fileModel!=NULL && fileModel->isDir(index0)) 
    { 
     qDebug() << fileModel->fileName(index0); 
     if (QString::compare(fileModel->fileName(index0), tr("private")) == 0) 
      return false; 

     return true; 
    } 
    else 
     return false; 
    // uncomment to execute default implementation 
    //return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); 
} 

ya he probado esto y funciona perfectamente. serge_gubenko debe recibir todo el crédito debido.