7

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

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

例えば:

表示するファイル:

file1.xml  
file2.xml

表示しないファイル:

file1.backup.xml  
file2.backup.xml

QFileDialog? _

4

3 に答える 3

11

あなたができることは次のとおりだと思います:

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

以下に例を示します。

プロキシ モデル:

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

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

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

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

于 2011-02-04T02:14:37.287 に答える
-1

さて、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 ファイルのみが表示されます。

于 2014-10-13T23:45:09.547 に答える