Найти - Пользователи
Полная версия: PyQt4 QSettings проблемы.
Начало » GUI » PyQt4 QSettings проблемы.
1 2
ValeriyB
Привет.

Сохраняю строку в файл ini следующим образом:

settings.setValue('settings/test', self.lineEdit.text())

Загружаю её из файла так:

self.ui.lineEdit.setText(settings.value('settings/test', ''))

Если строка не очень длинная, то сохраняет ее так:

[settings]
test=my test string

Если длинная, то так:

[settings]
test="my test string 1veryverylongstringsadfnbadskjgnsdkjfnkjsdnfkjsdnfkjsdnfkjsdnfkjsndkfjnsdkjfn"

Т. е. Добавляет двойные кавычки.

Поэтому когда загружается длинная строка, она загружается вместе с кавычками. А такого быть не должно. Это проблема номер 1, но не это мешает, т.к. я написал функцию, которая обрезает эти кавычки при загрузке.

Проблема номер 2:

Как я уже говорил, если сохранять короткую строку, то сохраняет без кавычек. Если эта строка содержит символ к примеру “,” (запятая), то при загрузке этой строки из файла настроек вылетает ошибка: QLineEdit.setText(str): argument 1 has unexpected type ‘list’.
Оно распознает эту строку ( test=my test, string) как лист…

Есть каки-е либо рекомендации как беспроблемно сохранять данные в ini и загружать их от туда?
Есть у меня мысль кодировать эти строки в HEX тогда проблем не будет, но тогда файл примет нечитабельный вид… Чего не хотелось бы.


reclosedev
Не могу воспроизвести. Напишите:
  • Версия PyQt
  • Версия Python
  • Код открытия файла настроек
  • Не переопределен ли LineEdit

from PyQt4 import QtCore
  
test_string = "looooong" * 1000
test_string_with_spaces = "looooong loong asdf" * 100000
settings = QtCore.QSettings("test.ini", QtCore.QSettings.IniFormat)
settings.setValue('test1', test_string)
settings.setValue('settings/test1', test_string)
settings.setValue('settings/test2', test_string_with_spaces)

В результате - строка без кавычек, размером около мегабайта.
ValeriyB
Код сохранения чую виноват. Т.е. Я считываю настройки, меняю их, затем записываю в файл.

cfgparser = configparser.ConfigParser()
cfgparser.read_file(open(PATH))
settings = cfgparser
..... Тут обработка настроек
settings .write(open(PATH, "w")) <-- а это сохранение. cfgparser сохраняет неправильно видимо, может доп. параметры нужны.

reclosedev
А при чем тут ConfigParser, если используется QSettings? Если QSettings был правильно создан, с именем файла и параметром QtCore.QSettings.IniFormat (см. код в предыдущем посте), то настройки сохранятся в файл test.ini после вызова деструктора QSettings. Также можно вызвать QSettings.sync() для досрочной записи результатов.
ValeriyB
Отказался от использования конфиг парсера - все Ok.
ValeriyB
Возник вопрос.

Я загружаю настройки:

settings = QtCore.QSettings("test.ini", QtCore.QSettings.IniFormat)
...... редактирую их ......

Как сохранить эти настройки в другой файл? Допустим test2.ini ?
reclosedev
Хм, похоже в QSettings такое не предусмотрено. Но можно написать самому:

def copy_settings_to_file(settings, filename):
    new_settings = QtCore.QSettings(filename, QtCore.QSettings.IniFormat)
    for key in settings.allKeys():
        new_settings.setValue(key, settings.value(key))
    new_settings.sync()
 
copy_settings_to_file(settings, 'test2.ini')
ValeriyB
Хороший вариант, спасибо.
ValeriyB
Чтобы не плодить похожие темы опишу еще одну проблему с Qsettings тут.

Файл настроек:

[test1]
test1Key1="..."
test1Key2="..."
test1Key3="..."
[test2]
test2Key1="..."
test2Key2="..."
test2Key3="..."
[test3]
test3Key1="..."
test3Key2="..."
test3Key3="..."

Код:

        for group in settings.childGroups():
            settings.beginGroup(group)
            for key in settings.childKeys():
                print(group + " : " + key)

Хочу получить следующий вывод:

test1 : test1Key1
test1 : test1Key2
test1 : test1Key3
test2 : test2Key1
test2 : test2Key2
test2 : test2Key3
test3 : test3Key1
test3 : test3Key2
test3 : test3Key3

А получаю такой:

test1 : test1Key1
test1 : test1Key2
test1 : test1Key3

Что я делаю не так?
reclosedev
ValeriyB
Что я делаю не так?
Нужно добавить settings.endGroup()

for group in settings.childGroups():
    settings.beginGroup(group)
    for key in settings.childKeys():
        print(group + " : " + key)
    settings.endGroup()

Иначе на второй итерации группа ставится в test1/test2 а на третьей test1/test2/test3
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB