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...

从一个答案中,我尝试了一个邪恶的实验,在“点 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()将打开一个文件对话框,该对话框是您正在运行的操作系统的本机文件。您的用户可能更喜欢这个选项的熟悉度。

更新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它将按字母顺序对字符串进行排序,因此使用它来获得您正在寻找的行为并不需要太多工作。在示例中使用“point 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库的实现……而是取决于本机操作系统的实现……

例如在 Windows 中,

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

并且不确定其他环境,因为不习惯它们...

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

所以,我相信它确实取决于本机操作系统的实现,而不是QFileDialog...

于 2010-09-02T06:15:30.107 回答