Russian Qt Forum

Qt => Общие вопросы => Тема начата: Givoi от Декабрь 27, 2011, 21:12



Название: QSettings в буфер
Отправлено: 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, но как потом обращаться к нему хз, если это будет массив то по ключу к нему не обратиться, только по индексу элемента? или я ошибаюсь? вообщем нужна Ваша помощь.


Название: Re: QSettings в буфер
Отправлено: asvil от Декабрь 27, 2011, 21:38
qsettings буферизирует настройки


Название: Re: QSettings в буфер
Отправлено: Givoi от Декабрь 27, 2011, 21:40
а как к ним обратиться тогда?


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


Название: Re: QSettings в буфер
Отправлено: Givoi от Декабрь 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);
}
 

немного мудрено, но работает.
Всем спасибо!


Название: Re: QSettings в буфер
Отправлено: kambala от Декабрь 28, 2011, 17:43
не зря ж я сказал про создание на стеке - у тебя сейчас утечка памяти в первых двух функциях. если к этим функциям идёт довольно частое обращение, то проще уж объект типа QSettings сделать членом класса (или, если не хочется эти функции засовывать в класс, то глобальной переменной, но это не лучший подход).


Название: Re: QSettings в буфер
Отправлено: Givoi от Декабрь 28, 2011, 17:52
если к этим функциям идёт довольно частое обращение

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


Название: Re: QSettings в буфер
Отправлено: kambala от Декабрь 28, 2011, 22:15
кстати, проверять на пустую строку лучше методом isEmpty(), а не сравнением с "". и в качестве пустой строки лучше возвращать QString() вместо "".


Название: Re: QSettings в буфер
Отправлено: Givoi от Декабрь 28, 2011, 22:33
ок, спасибо


Название: Re: QSettings в буфер
Отправлено: JamS007 от Январь 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();
}