是什么决定了QFileDialog中文件的排序?

Dar*_*enW 5 sorting qt qt4 qfiledialog

用户通过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...
Run Code Online (Sandbox Code Playgroud)

从其中一个答案中,我尝试了一个邪恶的实验,在"点x"处添加了这个不明智的猜测代码:

QSortFilterProxyModel *sorter = new QSortFilterProxyModel();
sorter->sort(1);  // ???
chooser.setProxyModel(sorter);
Run Code Online (Sandbox Code Playgroud)

但是,在这个代码级别的33个子程序调用中,这一点大为震惊.我承认,即使在阅读了Qt4文档和示例代码之后,我也不知道QSortFilterProxyModel的正确用法.

Arn*_*nce 4

您是QFileDialog通过电话使用吗exec()?如果是,您应该有一个按钮可以将视图切换到详细视图。这将为您提供一些列标题,您可以单击这些标题对文件进行排序。它应该在下次对话框打开时记住该模式,但您可以通过setViewMode(QFileDialog::Detail)在调用之前调用来强制它exec()

另一种方法是调用静态函数QFileDialog::getOpenFileName(),该函数将打开您正在运行的操作系统本机的文件对话框。您的用户可能更喜欢这个选项的熟悉程度。

更新1:

关于OP屏幕截图中的排序顺序: 替代文本

该屏幕截图实际上显示了一个排序列表。我不知道列表行为是否源自 Qt 对话框或底层文件系统,但我知道 Windows XP,后来又这样做了。

对嵌入数字的文件名进行排序时,任何连续数字都将被视为单个数字。使用更经典的纯字符串排序,文件将按如下方式排序:

A_A_10e0
A_A_9a05
Run Code Online (Sandbox Code Playgroud)

按字符排列,第一个 1 排在 9 之前。

..但是通过数值解释(至少在 Windows 7 中),它们被排序为:

A_A_9a05
A_A_10e0
Run Code Online (Sandbox Code Playgroud)

9 排在 10 之前。

因此,您看到的排序是按字母顺序和数字解释进行的,而不仅仅是直接按字符排序。可能需要进行一些深入挖掘才能确定这是 Qt 行为还是操作系统行为以及是否可以配置。

更新2:

默认情况下,它将QSortFilterProxyModel按字母顺序对字符串进行排序,因此使用它来获得您正在寻找的行为不需要太多工作。在示例中有“point x”的地方使用以下代码..(您几乎已经拥有它了:)

QSortFilterProxyModel *sorter = new QSortFilterProxyModel();
sorter->setDynamicSortFilter(true); // This ensures the proxy will resort when the model changes
chooser.setProxyModel(sorter);
Run Code Online (Sandbox Code Playgroud)

  • 更新:我已经在加载了 Qt4.6 的 Linux VM 上编译了该应用程序,并使用了 QSortFilterProxyModel 代码,并且它可以工作!没有崩溃错误。现在正式版采用Qt4.6只是时间问题了。 (2认同)