Russian Qt Forum
Сентябрь 30, 2024, 14:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Зачем QSettings сортирует ключи?  (Прочитано 7224 раз)
SABROG
Гость
« : Февраль 13, 2010, 15:35 »

Столкнулся с неприятной особенностью. В ini файле разместил секции в порядке удобном для меня, для того чтобы названиями секций заполнить QComboBox. И оказалось, что как не указывай:

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

или

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

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

Вопрос можно решить введением дополнительного ключа сортировки, но это конечно костыль уже.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Февраль 13, 2010, 15:57 »

Цитировать
Зачем QSettings сортирует ключи?
Сортирует QMap, в который они засовываются внутри QSettings

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

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

Ладно бы он их по человечески сортировал, дак ведь там ещё алгоритм сортировки основанный исключительно на тексте.
« Последнее редактирование: Февраль 13, 2010, 15:59 от lit-uriy » Записан

Юра.
asvil
Гость
« Ответ #2 : Февраль 13, 2010, 15:59 »

Видимо внутри используется QMap, который сортирует по значению bool operator < (const QString&, const QString&).
Записан
niXman
Гость
« Ответ #3 : Февраль 13, 2010, 17:25 »

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

глянул исходники QSettings. оказывается очень просто сие чудо исправить, используя unordered_map<>
в gcc, начиная с версии 4.4.0, хидер зовется unordered_map
или же бустовский хидер boost/unordered_map.hpp

Для этого придется исправить исходники Qt?
Записан
niXman
Гость
« Ответ #5 : Февраль 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;
 
предварительно подключив хидер.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Февраль 13, 2010, 19:12 »

а я бы на QHash заменил. Ничего не сортирует и работает быстрее.
Записан

Юра.
Kolobok
Гость
« Ответ #7 : Февраль 14, 2010, 14:49 »

А чем поможет QHash в этом случае. Он тоже возвращает ключи не в том порядке, в котором они были вставлены.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #8 : Февраль 14, 2010, 17:26 »

Цитировать
В ini файле разместил секции в порядке удобном для меня
Ну а разве INI файл сам предусматривает порядок сортировки (есть именнованная секция, и есть параметры внутри нее - никакой очередности...)? А QSettings создавался чтобы вытянуть нужные настройки - обычно для этого не требуется оригинальный порядок, просто программа сама в нужной очередности тянет нужный параметр.

Может сохраните свой список в XML. Там порядок нодов сохраняется таким каким был при записи/чтение.
Записан
SABROG
Гость
« Ответ #9 : Февраль 15, 2010, 00:21 »

Да вариантов куча как можно сделать. Это даже не вопрос, я просто поделился с чем столкнулся. Изначально грешил на QComboBox и его политику вставки новых элементов. Убил на это минут 30 пока разобрался что происходит. Может сама мысль о возможности подобного поведения у людей в голове останется на будущее.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.268 секунд. Запросов: 23.