gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:52:47 24 4
gpt4 key购买 nike

用户通过 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 的正确用法。

最佳答案

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

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

更新 1:

关于来自 OP 的屏幕截图中的排序顺序:
alt text

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

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

A_A_10e0
A_A_9a05

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

.. 但是用数字解释(至少在 Windows 7 中),它们被排序为:
A_A_9a05
A_A_10e0

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);

关于qt - 什么决定了 QFileDialog 中文件的排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3621949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com