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

时间:2010-09-01 20:33:00

标签: qt sorting 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...

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

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

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

3 个答案:

答案 0 :(得分:4)

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

另一种方法是调用静态函数QFileDialog::getOpenFileName(),它将打开一个文件对话框,该对话框是您运行的操作系统的原生对象。您的用户可能更喜欢熟悉此选项。

更新1:

关于OP中屏幕上限的排序顺序: alt text

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

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

A_A_10e0
A_A_9a05

逐个字符,第一个在9之前排序。

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

A_A_9a05
A_A_10e0

10之前的9种。

因此,您所看到的排序是按字母顺序排列的数字解释,而不仅仅是直接逐字符。可能需要进行一些深入挖掘,以确定是否是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);

答案 1 :(得分: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

答案 2 :(得分:0)

我认为这不取决于Qt库的实现......但是在Native OS实现上......

例如在Windows中,

如果您使用QFileDialog,它将按Name排序显示文件和目录。在其他应用程序中使用时也是如此。从某种意义上说,如果您尝试通过MS- Word打开文件,它确实会将文件和目录显示为Name默认排序 ..

我不确定其他环境,因为我不习惯他们......

但在Windows中,您可以通过右键单击“文件和目录”显示区域来更改排序顺序,并可以选择您喜欢的选项。例如名称,大小,类型,修改 ...当你使用MS-Word应用程序时,它也是类似的......

所以,我相信它确实取决于Native OS的实现而不是QFileDialog的...