3

QTreeViewとQFileSystemModelを使用して特定のフォルダーをフィルタリングする際に問題が発生しました。

ルートQFileSystemModelを特定のフォルダーに設定しました-これは機能します。ただし、ファイルを含むフォルダーのみを表示したいと思い.jpgます。これは可能ですか?

ファイルをフィルタリング.jpgすると機能しますが、QTreeViewには、ファイルがないフォルダーも含め、すべてのフォルダーが表示され.jpgます。したがって、ユーザーが.jpgファイルなしでフォルダを開こうとしても、何も起こりません。

これらのフォルダを非表示にするにはどうすればよいですか?

注:以下にコードの一部があります。

QStringList filterTypeFile;
filterTypeFile.append("*.jpg");
this->m_pModelTreeViewImage->setNameFilters(filterTypeFile);
this->m_pModelTreeViewImage->setNameFilterDisables(false);

this->ui->treeViewImages->setModel(this->m_pModelTreeViewImage);
4

2 に答える 2

4

悪いニュースですが、そのような動作が必要な場合は、これを自分で実装する必要があります。ファイル システム リーダーは、このようなことを行うように設定されていません。

それにも理由があります。ファイルの非表示は、ファイル名が正規表現に一致するかどうかに関係なく、高速で簡単であるため、一般的にサポートされています。ディレクトリを非表示にする(または開くことができないようにする - 同じ違い)のは、はるかにトリッキーです。ディレクトリ名だけを見ることはできません。開くことができるファイルを探して、ファイル システムをクロールする必要があります。また、ハード ドライブへのアクセスが遅い。ユーザーがファイル システムのルートに非常に近いディレクトリを見ているとします。すべてをクロールする必要があります。そして、フィルターが変更された場合は、すべてやり直す必要があります。

また、考慮してください: これの確立されたパターンは、ファイルのみを非表示にし、ディレクトリを非表示にしないことです。これはおそらく上記の技術的な問題の結果ですが、UI の標準的な動作になっています。そのため、ファイル システム ビューアに期待するすべてのフォルダが表示されない場合 (または、一見ランダムに特定のフォルダを開けない場合)、ユーザーは何かが壊れていると思い込みます。

とはいえ、とにかくそれを行う正当な理由がある場合は、おそらく QFileSystemModel を再実装して、必要なことを行うことができます (または、それが失敗した場合は、説明したように動作する AbstractModel サブクラスを確実に取得できます)。特に新しい動作に十分な理由がある場合、ユーザーは順応します。

幸運を!

于 2012-03-06T19:18:15.207 に答える
-1

関数から派生さQSortFilterProxyModelせて再実装 する必要がありvirtual bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const ます。このようなもの

bool JPGFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
   QFileSystemModel *fs = static_cast<QFileSystemModel*>(sourceModel());
   QModelIndex i = fs->index(source_row, 0, source_parent);
   bool accept=false;
   if( fs->hasChildren(i) ){
     for( int j=0; j<fs->rowCount(i); j++  )
       if( fs->fileInfo(fs->index(j,0,i)).suffix()=="jpg" ){
         accept=true;
         break;
       }
   }
   return accept;
}

私は自分でこれを試していません。遅いですが、動作するはずです。

于 2012-10-07T14:32:01.553 に答える