2011-02-03 4 views
5

QFileDialogに表示されているファイルを、ファイル拡張子だけでなく、より具体的にフィルタリングしたいと思います。 Qtのドキュメントにある例では、Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)などのフィルタしか表示されません。これに加えて、ではないファイルのフィルタを指定すると、がファイルダイアログに表示されます。 XML files (*.xml)ではなく、Backup XML files (*.backup.xml)である。QFileDialogのフィルタリング

ファイルの拡張子があるファイルダイアログにいくつかのファイルを表示したいのですが、特定のファイル名のサフィックス(および同じファイル拡張子)を持つ他のファイルを表示したくないという問題があります。 。

例えば:

ファイルは表示する:

file1.xml 
file2.xml 

ファイルを表示しない:のためにこれらのようなフィルタを定義することが可能である場合

file1.backup.xml 
file2.backup.xml 

は私がお願いしたいと思いますQFileDialog?私はあなたが何ができるかと考えてい

答えて

9

は次のとおりです。

  1. カスタムプロキシモデルを作成します。モデルの基本クラスとしてQSortFilterProxyModelを使用できます。
  2. プロキシモデルではfilterAcceptsRowメソッドをオーバーライドし、「バックアップ」のファイルに対してfalseを返します。彼らの名前に単語。
  3. 新しいプロキシモデルをファイルダイアログに設定します。QFileDialog::setProxyModel;以下は

は一例です:

プロキシモデル:プロキシモデルは非ネイティブファイルダイアログのみでサポートされてい

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

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

ダイアログは、このように作成されました。

0

私はQFileDialogオブジェクトでこれを使用しました。これは、適切なディレクトリにリストされているファイルのみを表示します。処理するファイルを選択するだけで優れています。例えば、XMLファイル、PNG画像など。ここで

私は

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; 

ダイアログボックスが表示されますが、唯一のxmlファイルを提示し、私の例で提示します。

0

@serge_gubenkoの解決策はうまくいきます。 QSortFilterProxyModelから継承して独自のProxyModelを作成します。

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

ただ、プロキシモデル(@serge_gubenkoがそれをしなかった方法)を設定する前DontUseNativeDialogを設定してください。ネイティブダイアログはカスタムProxyModelをサポートしていません。

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

これを見つけるのにかなり時間がかかりました。これは書かれましたhere

+0

これは質問への答えを提供しません。十分な[評判](https://stackoverflow.com/help/whats-reputation)があれば、[投稿にコメントする]ことができます(https://stackoverflow.com/help/privileges/comment)。代わりに、[質問者からの明確化を必要としない回答を提供する](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- i-do-代わりに)。 - [レビューから](/レビュー/低品質の投稿/ 18085257) –

関連する問題