среда, 19 марта 2014 г.

Qt: Работа с ini файлом

Часто приходится иметь дело с ini файлами. Так вот, Qt предоставляет класс для работы с этим форматом файлов. На первый взгляд кажется удобным, но посмотрим. В данной статье описано как работать с ini файлами.

Заметка! В ini файле символ ; (точка с запятой) является символом комментария. Поэтому, если значением ключа будет строка содержащая ;, то такую строку нужно заключать в двойные кавычки. При этом, если двойные кавычки есть частью строки, то их нужно экранировать символом \.

1. Чтение данных из ini файла

...
#include <QSettings>
#include <QVariant>
...
QSettings sett("path/to/ini/file", QSettings::IniFormat);
this->ftpHost = sett.value("CONNECT/HOST", "").toString();
this->ftpPort = sett.value("CONNECT/PORT", 21).toInt();
this->ftpUser = sett.value("CONNECT/USER", "anonymous").toString();
this->ftpPass = sett.value("CONNECT/PASS", "").toString();
this->ftpPassive = sett.value("CONNECT/PASSIVE", "true").toBool();

Для удобства можно воспользоватся методами beginGroup() и endGroup():

sett.beginGroup("CONNECT");
this->ftpHost = sett.value("HOST", "").toString();
this->ftpPort = sett.value("PORT", 21).toInt();
this->ftpUser = sett.value("USER", "anonymous").toString();
this->ftpPass = sett.value("PASS", "").toString();
this->ftpPassive = sett.value("PASSIVE", "true").toBool();
sett.endGroup();

Метод value() принимает два параметра. Первый параметр, типа QString, это путь к ключу, который включает в себя секцию и ключ разделенные слэшем. Второй параметр, типа QVariant - значение по умолчанию, которое используется в том случае, если ключа в указанной секции не существует. Возвращает метод значение типа QVariant.

2. Добавление и изменение данных в ini файле

QSettings sett("path/to/ini/file", QSettings::IniFormat);
sett.setValue("SECTION/KEY", "Some value");

или так:

QSettings sett("path/to/ini/file", QSettings::IniFormat);
beginGroup("SECTION");
sett.setValue("KEY", "Some value");
endGroup("SECTION");

Метод setValue() принимает два параметра. Первый параметр, типа QString, указывает путь к создаваемому, или изменяемому ключу. Если ключа не существует, то он будет создан. Второй параметр, типа QVariant - задает значение записываемого ключа.

3. Проверка существования ключа

if ( sett.contains("SECTION/KEY") ){
  ...
}

Метод contains() проверяет ключ на наличие его в ini файле. Принимает один параметр типа QString и возвращает булево значение.

4. Проверка существования секции

Проверить существует ли секция в ini файле можно таким способом:

QStringList sections = sett.childGroups();
if ( sections.contains("SECTION_6", Qt::CaseInsensitive) ){
    QMessageBox::information(this, "Information", "Success");
} else{
    QMessageBox::information(this, "Information", "Fail");
}

Заметка! Следует учитывать что метод childGroups() игнорирует пустые секции.

5. Удаление ключа, или секции

  • Удаление ключа:
    sett.remove("SECTION/KEY");
    

    Заметка! Если удаляется последний ключ в секции, то удаляется и сама секция.

  • Удаление секции:
    sett.remove("SECTION");
    
  • Очистка всего ini файла:
    sett.remove("");
    

Удачи!

2 комментария:

  1. здравствуйте, подскажите пожалуйста - можно ли в
    this->ftpHost = sett.value("CONNECT/HOST").toString();
    вместо "CONNECT/HOST" в роли ключа передать переменную?
    и если то можно то как?

    ОтветитьУдалить
  2. QString key = "CONNECT/HOST";
    this->ftpHost = sett.value(key).toString();

    ОтветитьУдалить