Russian Qt Forum

Qt => Общие вопросы => Тема начата: SABROG от Февраль 13, 2010, 15:35



Название: Зачем QSettings сортирует ключи?
Отправлено: SABROG от Февраль 13, 2010, 15:35
Столкнулся с неприятной особенностью. В ini файле разместил секции в порядке удобном для меня, для того чтобы названиями секций заполнить QComboBox. И оказалось, что как не указывай:

Код
INI
[Saratov]
...
[Moscow]
 

или

Код
INI
[Moscow]
...
[Saratov]
 

Метод QSettings::childGroups() всегда выдает отсортированный список такой последовательности: "Moscow", "Saratov"

Вопрос можно решить введением дополнительного ключа сортировки, но это конечно костыль уже.


Название: Re: Зачем QSettings сортирует ключи?
Отправлено: lit-uriy от Февраль 13, 2010, 15:57
Цитировать
Зачем QSettings сортирует ключи?
Сортирует QMap, в который они засовываются внутри QSettings

А ты ещё попробуй такие группы сделать:
[Goup-1]
[Goup-2]
...
[Goup-9]
[Goup-10]

в результате получишь вот так:
[Goup-1]
[Goup-10]
[Goup-2]
...
[Goup-9]

Ладно бы он их по человечески сортировал, дак ведь там ещё алгоритм сортировки основанный исключительно на тексте.


Название: Re: Зачем QSettings сортирует ключи?
Отправлено: asvil от Февраль 13, 2010, 15:59
Видимо внутри используется QMap, который сортирует по значению bool operator < (const QString&, const QString&).


Название: Re: Зачем QSettings сортирует ключи?
Отправлено: niXman от Февраль 13, 2010, 17:25
глянул исходники QSettings. оказывается очень просто сие чудо исправить, используя unordered_map<>
в gcc, начиная с версии 4.4.0, хидер зовется unordered_map
или же бустовский хидер boost/unordered_map.hpp


Название: Re: Зачем QSettings сортирует ключи?
Отправлено: SABROG от Февраль 13, 2010, 18:10
глянул исходники QSettings. оказывается очень просто сие чудо исправить, используя unordered_map<>
в gcc, начиная с версии 4.4.0, хидер зовется unordered_map
или же бустовский хидер boost/unordered_map.hpp

Для этого придется исправить исходники Qt?


Название: Re: Зачем QSettings сортирует ключи?
Отправлено: niXman от Февраль 13, 2010, 18:30
конечно, стандартный QMap не умеет хранить ключи неотсортироваными.

кратко глянув, в первую очередь я бы заменил строку 190 в файле src/corelib/io/qsettings.h
Код
C++ (Qt)
typedef QMap<QString, QVariant> SettingsMap;
 
на:
Код
C++ (Qt)
typedef std::unordered_map<QString, QVariant> SettingsMap;
 
предварительно подключив хидер.


Название: Re: Зачем QSettings сортирует ключи?
Отправлено: lit-uriy от Февраль 13, 2010, 19:12
а я бы на QHash заменил. Ничего не сортирует и работает быстрее.


Название: Re: Зачем QSettings сортирует ключи?
Отправлено: Kolobok от Февраль 14, 2010, 14:49
А чем поможет QHash в этом случае. Он тоже возвращает ключи не в том порядке, в котором они были вставлены.


Название: Re: Зачем QSettings сортирует ключи?
Отправлено: break от Февраль 14, 2010, 17:26
Цитировать
В ini файле разместил секции в порядке удобном для меня
Ну а разве INI файл сам предусматривает порядок сортировки (есть именнованная секция, и есть параметры внутри нее - никакой очередности...)? А QSettings создавался чтобы вытянуть нужные настройки - обычно для этого не требуется оригинальный порядок, просто программа сама в нужной очередности тянет нужный параметр.

Может сохраните свой список в XML. Там порядок нодов сохраняется таким каким был при записи/чтение.


Название: Re: Зачем QSettings сортирует ключи?
Отправлено: SABROG от Февраль 15, 2010, 00:21
Да вариантов куча как можно сделать. Это даже не вопрос, я просто поделился с чем столкнулся. Изначально грешил на QComboBox и его политику вставки новых элементов. Убил на это минут 30 пока разобрался что происходит. Может сама мысль о возможности подобного поведения у людей в голове останется на будущее.