5

ユーザーは、QFileDialogを介してアプリでファイルを開きます。ファイル名の順序は奇妙です。並べ替え順序を決定するのは何ですか。ファイル名で並べ替える方法や、独自の比較関数へのポインターを指定して独自の並べ替えを適用するにはどうすればよいですか。

ドキュメントとオンラインフォーラムは役に立ちませんでした。よく隠されていない限り、並べ替え方法やプロパティなどはないようです。

これは主にLinuxアプリですが、Macでも動作します。(私はMacについて何も知りません。)

ソースコードのジューシーな部分は次のとおりです。

QtFileDialog chooser(parent, caption, directory, filter);
/// QtFileDialog is our class derived from QFileDialog

chooser.setModal(true);
chooser.setAcceptMode(acceptMode);
chooser.setFileMode(fileMode);

QStringList hist = chooser.history();
chooser.setHistory(hist);

/* point "x" */

if(chooser.exec()) {    
    QStringList files = chooser.selectedFiles();
    ...blah blah blah...

答えの1つから、私は邪悪な実験を試み、「ポイントx」にこの情報不足の当て推量コードを追加しました。

QSortFilterProxyModel *sorter = new QSortFilterProxyModel();
sorter->sort(1);  // ???
chooser.setProxyModel(sorter);

しかし、これは、このレベルのコードから約33のサブルーチン呼び出しの時点で見事にクラッシュしました。Qt4のドキュメントとサンプルコードを読んだ後でも、QSortFilterProxyModelの適​​切な使用法がわからないことは認めます。

4

3 に答える 3

4

QFileDialog電話で利用していますexec()か?その場合は、ビューをDetail Viewに切り替えるボタンが必要です。これにより、クリックしてファイルをソートできる列ヘッダーが表示されます。次回ダイアログが開いたときにそのモードを記憶する必要がありますが、呼び出すsetViewMode(QFileDialog::Detail)前に呼び出すことで強制できますexec()

QFileDialog::getOpenFileName()別の方法として、実行中の OS に固有のファイル ダイアログを開く静的関数を呼び出すこともできます。ユーザーは、このオプションの親しみやすさを好むかもしれません。

更新 1:

OPからのスクリーンキャップのソート順について: 代替テキスト

このスクリーン キャプチャは、実際には並べ替えられたリストを示しています。リストの動作が Qt ダイアログによるものなのか、基盤となるファイル システムによるものなのかはわかりませんが、Windows XP 以降ではこの方法で行われることはわかっています。

数字が埋め込まれたファイル名をソートする場合、連続した数字は単一の数字として扱われます。より古典的な単純な文字列の並べ替えでは、ファイルは次のように並べ替えられます。

A_A_10e0
A_A_9a05

文字ごとに、最初の 1 が 9 の前にソートされます。

..しかし、数値解釈では(少なくともWindows 7のように)、次のようにソートされます。

A_A_9a05
A_A_10e0

9 は 10 の前にソートされます。

したがって、表示されている並べ替えは、数字の解釈を伴うアルファベット順であり、文字ごとの単純な並べ替えではありません。それが Qt の動作なのか OS の動作なのか、および構成できるかどうかを確認するには、詳細な調査が必要になる場合があります。

更新 2:

QSortFilterProxyModel、デフォルトで文字列をアルファベット順にソートするため、探している動作を取得するために使用する作業はあまりありません。あなたの例で「ポイントx」がある次のコードを使用してください..(あなたはほとんどそれを持っていました:)

QSortFilterProxyModel *sorter = new QSortFilterProxyModel();
sorter->setDynamicSortFilter(true); // This ensures the proxy will resort when the model changes
chooser.setProxyModel(sorter);
于 2010-09-01T22:22:04.203 に答える
2

あなたがする必要があるのは、 QSortFilterProxyModel を作成し、それを QFileDialog::setProxyModel(QAbstractProxyModel * proxyModel) で QFileDialog に設定することだと思います

これに関するQt 4.6ドキュメントへの関連リンクがいくつかあります。

http://doc.trolltech.com/4.6/qfiledialog.html#setProxyModel

http://doc.trolltech.com/4.6/qsortfilterproxymodel.html#details

于 2010-09-01T20:54:07.883 に答える
0

ライブラリの実装に依存するとは思わないQt...しかし、ネイティブOSの実装に..

たとえば、Windows では、

を使用するQFileDialogと、ファイルとディレクトリがNameソートされて表示されます。他のアプリケーションで使用する場合も同様です。を介してファイルを開こうとするとMS- Word、実際にファイルとディレクトリがデフォルトNameでソートされて表示されるという意味で..

また、慣れていないため、他の環境についてはわかりません...

しかし、Windows では、ファイルとディレクトリ表示の領域を右クリックして、並べ替え順序を変更し、好きなオプションを選択できます。たとえば、名前、サイズ、タイプ、変更などのように...そして、どちらも似ていますが、アプリケーションを使用するとMS-Word ...

だから、それはネイティブOSの実装に依存していると思いますQFileDialog...

于 2010-09-02T06:15:30.107 に答える