От чего зависит сортировка файлов в QFileDialog? - PullRequest
5 голосов
/ 02 сентября 2010

Пользователи открывают файлы в нашем приложении через 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 ]

4 голосов
/ 02 сентября 2010

Вы используете QFileDialog, позвонив по номеру exec()? Если да, у вас должна быть кнопка для переключения вида на Подробный вид . Это даст вам некоторые заголовки столбцов, по которым вы можете щелкнуть, чтобы отсортировать файлы. Следует помнить этот режим при следующем открытии диалогового окна, но вы можете принудительно вызвать его, позвонив setViewMode(QFileDialog::Detail) перед вызовом exec().

В качестве альтернативы можно вызвать статическую функцию QFileDialog::getOpenFileName(), которая откроет диалоговое окно файла, которое является родным для ОС, на которой вы работаете. Вашим пользователям может понравиться знакомство с этой опцией.

Обновление 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:

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} <1039} по умолчанию сортирует строки в алфавитном порядке, поэтому для его использования не требуется много усилий для получения искомого поведения. Используйте следующий код, где у вас есть «точка x» в вашем примере .. (у вас почти было это:) </p>

QSortFilterProxyModel *sorter = new QSortFilterProxyModel();
sorter->setDynamicSortFilter(true); // This ensures the proxy will resort when the model changes
chooser.setProxyModel(sorter);
2 голосов
/ 02 сентября 2010

Я думаю, вам нужно создать QSortFilterProxyModel, которую вы затем установите в QFileDialog с помощью QFileDialog :: setProxyModel (QAbstractProxyModel * proxyModel)

Вот некоторые соответствующие ссылки на документы Qt 4.6 об этом.

http://doc.trolltech.com/4.6/qfiledialog.html#setProxyModel

http://doc.trolltech.com/4.6/qsortfilterproxymodel.html#details

0 голосов
/ 02 сентября 2010

Я не думаю, что это зависит от реализации Qt библиотек ... Но от реализации Native OS ..

Например, в Windows,

, если вы используете QFileDialog, он будет отображать файлы и каталоги с сортировкой Name. То же самое при использовании в других приложениях.В том смысле, что если вы попытаетесь открыть файл через MS- Word, он действительно отобразит файлы и каталоги как Name отсортированные по умолчанию ..

И не уверен насчетдругие среды, поскольку я к ним не привык ...

Но в Windows вы можете изменить порядок сортировки, щелкнув правой кнопкой мыши в области отображения файлов и каталогов и выбрав нужные параметры. Например, например,как Имя, размер, тип, модифицированный ... А также, что аналогично, когда вы используете MS-Word приложение ...

Итак, я считаю, что это зависит от NativeРеализация ОС а не на QFileDialog х ...

...