【问题标题】:qfiledialog - Filtering Folders?qfiledialog - 过滤文件夹?
【发布时间】:2011-01-07 06:00:18
【问题描述】:

1)我想获取文件夹监控应用程序的文件夹名称.. 有没有一种方法可以过滤掉使用 QFileDialog 显示的特定文件夹(例如,我不希望我的文档显示在文件对话框中)..

2) 我不希望用户选择驱动器。默认情况下,在此代码中也可以选择驱动器..

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

有没有办法可以让驱动器或某些特定文件夹变灰以使其无法被选择,或者我可以为文件夹设置过滤器以防止显示它..

【问题讨论】:

    标签: qt pyqt qfiledialog


    【解决方案1】:

    我知道这不是您要问的,但如果您使用的是 QFileSystemModel,则可以使用名称过滤器选项来完成。

    model = QFileSystemModel()
    model.setNameFilters(["[abcdefghijklmnopqrstuvwxyz1234567890]*"])
    model.setNameFilterDisables(False)
    

    它对我有用,我在互联网上的其他任何地方都找不到答案,所以我想我把它贴在这里。

    (我知道我的正则表达式很垃圾,但是使用 [\\w\\d]* 没有用,我感到很懒惰。)

    【讨论】:

      【解决方案2】:

      您可以尝试为您的文件对话框设置代理模型:QFileDialog::setProxyModel。在代理模型类中覆盖filterAcceptsRow 方法并为您不想显示的文件夹返回false。下面是代理模型的外观示例;它是c c++,如果将此代码转换为python有任何问题,请告诉我。这个模型应该过滤掉文件并只显示文件夹:

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

      我是这样称呼它的

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

      请注意,代理模型仅受非本机文件对话框支持。

      【讨论】:

        【解决方案3】:

        serge_gubenko 给了你正确的答案。您只需检查文件夹名称并为不应显示的文件夹返回“false”。例如,要过滤掉任何名为“private”的文件夹,你会写:

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

        我已经对此进行了测试,并且效果很好。 serge_gubenko 应该得到所有应得的功劳。

        【讨论】:

          【解决方案4】:

          您可以尝试使用 QDir.Dirs 过滤器。

          dialog = QtGui.QFileDialog(parentWidget)
          
          dialog.setFilter(QDir.Dirs)
          

          【讨论】:

          • 感谢您的回复。但它会列出所有目录..这里我只想列出特定目录..上面的代码也一样..我的问题是像文件扩展名过滤器一样有目录过滤器吗?还有一个问题是,当用户选择特定目录时,可以禁用“qfiledialog 中的确定按钮”..
          猜你喜欢
          • 1970-01-01
          • 2012-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-23
          相关资源
          最近更新 更多