2012-03-06 22 views
3

QTreeViewとQFileSystemModelを使用して特定のフォルダをフィルタリングする際に問題があります。QTreeViewとQFileSystemModelを使用して特定のファイルのフォルダのみを表示するにはどうすればいいですか?

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

Iフィルタ.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); 

答えて

3

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

それには理由もあります。ファイルを隠すことは一般的にサポートされています。なぜなら、ファイル名があなたの正規表現にマッチするか、そうでないかのどちらかです。ディレクトリを隠す(またはそれらを開けないようにする - 同じ違い)は、はるかに面倒です。ディレクトリ名だけを見ることはできません。オープン可能なファイルを探してファイルシステムをクロールする必要があります。そしてハードドライブへのアクセスは遅いです。ユーザーがファイルシステムのルートに非常に近いディレクトリを探しているとします。すべてをにクロールする必要があります。そして、フィルターが変更された場合は、もう一度やり直す必要があります。

また、次の点を考慮してください。このために確立されたパターンは、ファイルを隠すだけで、ディレクトリを隠すことはありません。これはおそらく前述の技術的な困難の結果ではありますが、標準のUI動作になっています。したがって、ユーザーが期待するすべてのフォルダを表示していないファイルシステムビューアを見つけた場合(または特定のフォルダを開くことができない場合は、と思われます。がランダムに表示されます)、何らかの問題が発生していると見なされます。あなたが望むことをやり遂げるために、QFileSystemModelを再実装することができます(または失敗した場合は、あなたが記述したように動作するようにAbstractModelサブクラスを得ることができます)。あなたのユーザーは、特に新しい行動の正当な理由がある場合、順応するでしょう。

幸運を祈る!

+1

ありがとう@Xavier Holt!私はあなたの答えについてすべてを理解し、本当に理にかなっています。 QFileSystemModel :: setFilter()のQtドキュメントでは、**あなたが設定したフィルタは常にQDir :: AllDirs列挙値を含んでいなければならないことに注意してください。 QFileSystemModelはディレクトリ構造を読み取ることができません。 本当にこの動作を実装する必要があるかどうかを調べます。とにかく、ありがとう! –

+0

まあ、私は自分のQTreeViewを実装しようとしています。 QTreeViewで最初のQModelIndexを選択する方法がわからないので問題があります。注:私はQFileSytemModelを使用しています。 –

+0

@AdrianoLeal - 私はQtのMVCを接線で使用していたので、これは単なる推測ですが、QFileSystemModelではなく、 "構造"関連のすべての情報(「最初の」モデルインデックスを含む)を取得しようとします。景色。 Qtビューは実際にはUI操作を処理するように設計されていますが、組織はモデル自体で処理されるようです。 –

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

私はこれを自分で試していません。それは遅いですが、うまくいくはずです。

+0

この解決法は優雅ではあるようですが、QFileSystemModelには使用済みのQModelIndexのみが含まれているように見えるため、このソリューションは機能しません。再帰的に空のディレクトリを削除することはできませんが、葉のディレクトリだけを削除することはできません。 – FabienRohrer

関連する問題