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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSettings в буфер  (Прочитано 4997 раз)
Givoi
Гость
« : Декабрь 27, 2011, 21:12 »

Добрый вечер.
Сразу скажу, Qt использую только неделю. Заранее извиняюсь за все косяки.
теперь вопрос:
есть файл с конфигурациями, создаваемый и заполняемый так:
Код:
    QSettings *settings = new QSettings("settings.cfg",QSettings::NativeFormat);
    settings->setValue(sector + "/" + key,value);  //!< устанавливаем значение
    settings->sync(); //!< записываем настройки

читаем:
Код:
    QSettings *settings2 = new QSettings("settings.cfg",QSettings::NativeFormat);
    value = settings2->value(sector + "/" + key,default_value).toString();  //!< выводим на экран настройки из файла, если там ничего нет то default_value

Приложение будет часто обращаться к конфигурациям, следовательно если их всё время читать из файла, это будет занимать много времени,
возможно как то сохранять содержимое файла в буфер, и работать с ним, в качестве буфера использовать QList, но как потом обращаться к нему хз, если это будет массив то по ключу к нему не обратиться, только по индексу элемента? или я ошибаюсь? вообщем нужна Ваша помощь.
Записан
asvil
Гость
« Ответ #1 : Декабрь 27, 2011, 21:38 »

qsettings буферизирует настройки
Записан
Givoi
Гость
« Ответ #2 : Декабрь 27, 2011, 21:40 »

а как к ним обратиться тогда?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #3 : Декабрь 27, 2011, 22:37 »

через объект QSettings как обычно, только лучше наверное создавать его на стеке:
Код
C++ (Qt)
QSettings settings("settings.cfg",QSettings::NativeFormat);
settings.value("mykey");
« Последнее редактирование: Декабрь 27, 2011, 22:42 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Givoi
Гость
« Ответ #4 : Декабрь 28, 2011, 17:38 »

Сделал через QMap

Код
C++ (Qt)
#include <QSettings>
#include <QDebug>
QMap <QString,QString> myByf;
 
void setSettingsCore(QString sector, QString key, QString value, QString firstName)
{
   QSettings *settings = new QSettings(firstName+".cfg",QSettings::NativeFormat);
   settings->setValue(sector + "/" + key,value);  
   settings->sync();
}
 
QString getSettingsCore(QString sector, QString key, QString firstName, QString defaultValue)
{
   QSettings *settings2 = new QSettings(firstName+".cfg",QSettings::NativeFormat);
   return settings2->value(sector + "/" + key,defaultValue).toString();
}
 
QString getMap(QString key)
{
   return myByf.value(key);
}
 
void setMap(QString key,QString value)
{
  myByf.insert(key,value);
}
 
void BkdmSettings::setSettings(QString sector, QString key, QString value, QString firstName)
{
   setMap(key,value);
   setSettingsCore(sector, key, value, firstName);
}
 
QString BkdmSettings::getSettings(QString sector, QString key, QString defaultValue, QString firstName)
{
   if (getMap(key)=="")
   {
       if (getSettingsCore(sector, key, firstName,"")=="")
       {
           qDebug()<<"ERR";
           return "";
       }
       else return(getSettingsCore(sector, key, firstName,defaultValue));
   }
   else return getMap(key);
}
 

немного мудрено, но работает.
Всем спасибо!
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #5 : Декабрь 28, 2011, 17:43 »

не зря ж я сказал про создание на стеке - у тебя сейчас утечка памяти в первых двух функциях. если к этим функциям идёт довольно частое обращение, то проще уж объект типа QSettings сделать членом класса (или, если не хочется эти функции засовывать в класс, то глобальной переменной, но это не лучший подход).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Givoi
Гость
« Ответ #6 : Декабрь 28, 2011, 17:52 »

если к этим функциям идёт довольно частое обращение

весь смысл кода - как можно меньше обращаться к ним, особенно к чтению, идет проверка - если в QMap есть то что нужно, то берется от туда.
Ну или по крайней мере это задумывалось.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #7 : Декабрь 28, 2011, 22:15 »

кстати, проверять на пустую строку лучше методом isEmpty(), а не сравнением с "". и в качестве пустой строки лучше возвращать QString() вместо "".
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Givoi
Гость
« Ответ #8 : Декабрь 28, 2011, 22:33 »

ок, спасибо
Записан
JamS007
Гость
« Ответ #9 : Январь 03, 2012, 23:04 »

Givoi, kambala тебе дело говорит. У тебя утечка памяти, похоже ты не только с Qt неделю знаком, но и с С++ не очень долго дружишь. Поясню как смогу Улыбающийся

Код
C++ (Qt)
void setSettingsCore(QString sector, QString key, QString value, QString firstName)
{
   QSettings *settings = new QSettings(firstName+".cfg",QSettings::NativeFormat);
   settings->setValue(sector + "/" + key,value);  
   settings->sync();
}
 
QString getSettingsCore(QString sector, QString key, QString firstName, QString defaultValue)
{
   QSettings *settings2 = new QSettings(firstName+".cfg",QSettings::NativeFormat);
   return settings2->value(sector + "/" + key,defaultValue).toString();
}
В этих функциях ты создаешь объекты settings и settings2 в куче (на хипе), то есть, каждый раз, когда ты вызываешь какую нибудь из этих функци ОС для этих объектов твоему приложению выделит дополнительную память. Ты ее никак не освобождаешь, и соответственно расходуешь память впустую. Хоть ты и кэшируешь вызовы (не уверен, не разбирался толком с кодом) но так делать - плохая привычка.

Варианты решения:
1. Удалять обьекты, тем самым освобождая память:
Код
C++ (Qt)
void setSettingsCore(QString sector, QString key, QString value, QString firstName)
{
   QSettings *settings = new QSettings(firstName+".cfg",QSettings::NativeFormat);
   settings->setValue(sector + "/" + key,value);  
   settings->sync();
   delete settings; //! clearing memory
}
QString getSettingsCore(QString sector, QString key, QString firstName, QString defaultValue)
{
   QSettings *settings2 = new QSettings(firstName+".cfg",QSettings::NativeFormat);
   QString resStr = settings2->value(sector + "/" + key,defaultValue).toString();
   delete settings2; //! clearing memory
   return resStr;
}

2: Создавать объекты на стеке (примечательней)
Код
C++ (Qt)
void setSettingsCore(QString sector, QString key, QString value, QString firstName)
{
   QSettings settings(firstName+".cfg",QSettings::NativeFormat);
   settings.setValue(sector + "/" + key,value);  
   settings.sync();
}
QString getSettingsCore(QString sector, QString key, QString firstName, QString defaultValue)
{
   QSettings settings2(firstName+".cfg",QSettings::NativeFormat);
   return settings2.value(sector + "/" + key,defaultValue).toString();
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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