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

Qt 什么决定QFileDialog中文件的排序?,qt,sorting,qt4,qfiledialog,Qt,Sorting,Qt4,Qfiledialog,用户通过QFileDialog在我们的应用程序中打开文件。文件名的顺序很奇怪。什么决定了排序顺序,我们如何让它按文件名排序,或者以其他方式强加我们自己的排序,也许给它一个指向我们自己的比较函数的指针 这些文档和在线论坛没有什么帮助。除非隐藏得很好,否则似乎没有任何排序方法、属性等 这主要是一个Linux应用程序,但也运行在Mac上。(我对Mac一无所知。) 以下是源代码的有趣部分: QtFileDialog chooser(parent, caption, directory, filter);

用户通过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点”添加了这个信息不充分的猜测代码:


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

我认为您需要做的是创建一个QSortFilterProxyModel,然后使用QFileDialog::setProxyModel(QAbstractProxyModel*proxyModel)在QFileDialog中设置它

这里有一些相关的链接到Qt4.6文档


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

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

更新1:

关于OP中屏幕封口的排序顺序:

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

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

A_A_10e0
A_A_9a05
一个字符接一个字符,第一个1在第9个之前排序

。。但通过数值解释(至少在Windows 7中),它们被分类为:

A_A_9a05
A_A_10e0
9在10之前排序

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

更新2:

默认情况下,
QSortFilterProxyModel
将按字母顺序对字符串进行排序,因此使用它来获得所需的行为不需要做很多工作。在示例中有“点x”的地方使用以下代码。。(你差点就成功了:)


我不认为这取决于
Qt
库的实现。。。但是在本机操作系统实现上

例如在Windows中

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

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

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


因此,我相信它确实取决于本机操作系统的实现,而不是QFileDialog的实现。

我们是在linux+Mac上开发的!看起来像是一罐我宁愿避免的复杂蠕虫。有没有一个使用QSortFilterProxyModel和文件打开对话框的简单例子?我看到的唯一例子是使用某种树列表之类的东西,我们并不关心。看起来这是我们控制分拣的唯一方法。可能,这就是我们要做的事情。我们会讨论的。理想情况下,我们希望对话框以用户希望的方式弹出,而不需要点击任何东西。您使用的是什么版本的Qt4?我确实看到了linux下QFileDialog中提到的一个bug,它导致了基于名称和扩展名的文件排序。你能举例说明你看到的排序行为吗?我想是Qt4.3。这里安装了多个版本以支持多种软件。一个示例屏幕容量:嗯,这很有趣。不幸的是,对于Qt的设计者来说,我们实验物理学家和EEs喜欢使用十六进制编号。更新:我已经在一个linux虚拟机上编译了这个应用程序,该虚拟机加载了Qt4.6,并且使用了QSortFilterProxy模型代码,它可以工作!没有崩溃错误。现在官方版本采用Qt4.6只是时间问题。
A_A_9a05
A_A_10e0
QSortFilterProxyModel *sorter = new QSortFilterProxyModel();
sorter->setDynamicSortFilter(true); // This ensures the proxy will resort when the model changes
chooser.setProxyModel(sorter);