У Qt есть способ сохранить настройки конфигурации в файле?

Есть ли рекомендуемый способ сохранения настроек моего приложения (например, выбор пользователя, размер окна, положение и т.д.) в файле (ini или любом другом формате) с использованием Qt?

Ответ 1

Если вы пытаетесь сохранить настройки для своего приложения в файле конфигурации, я уже использовал QSettings:

QSettings settings(QString("configs/config.ini"), QSettings::IniFormat);
QString someValue = settings.value("some/config/key", "default value if unset").toString(); // settings.value() returns QVariant

И exmaple configs/config.ini файл:

[some]
config/key=whatever string here

Ответ 2

Если вы имеете в виду конфигурационный файл для компиляции, тогда это файл проекта (pro). Если вы хотите сохранить некоторые настройки для своей собственной программы, вы можете попробовать QSettings. Конечно, вы можете написать класс для чтения/записи файла конфигурации, организованного вами самостоятельно.

Ответ 3

Взгляните на этот пост в блоге. Я использовал его и полностью доволен настройками XML. Методы Constructor и * Impl выглядят следующим образом:

Config::Config() {
    const QSettings::Format f=QSettings::registerFormat("xml", readImpl, writeImpl);
    QSettings::setDefaultFormat(f);
    s = new QSettings(f,QSettings::UserScope,QString("MyProject"),QString("settings"));
}

bool Config::readImpl(QIODevice& device, QSettings::SettingsMap& map) {
QXmlStreamReader xmlReader(&device);
QStringList elements;
while (!xmlReader.atEnd() && !xmlReader.hasError()) {
    xmlReader.readNext();
    if (xmlReader.isStartElement() && xmlReader.name() != "Settings") {
        elements.append(xmlReader.name().toString());
    } else if (xmlReader.isEndElement()) {
        if (!elements.isEmpty()) {
            elements.removeLast();
        }
    } else if (xmlReader.isCharacters() && !xmlReader.isWhitespace()) {
        QString key;
        for (int i = 0; i < elements.size(); i++) {
            if (i != 0) {
                key += "/";
            }
            key += elements.at(i);
        }
        map[key] = xmlReader.text().toString();
    }
}
if (xmlReader.hasError()) {
    sipDebug() << xmlReader.errorString();
    return false;
}
return true;
}

bool Config::writeImpl(QIODevice& device, const QSettings::SettingsMap& map) {
QXmlStreamWriter xml(&device); xml.setAutoFormatting(true);
xml.writeStartDocument(); xml.writeStartElement("Settings");
QStringList prev; QSettings::SettingsMap::ConstIterator map_i;
for (map_i = map.begin(); map_i != map.end(); map_i++) {
    QStringList elements = map_i.key().split("/"); int x = 0;
    while (x < prev.size() && elements.at(x) == prev.at(x)) {
        x++;
    }
    for (int i = prev.size() - 1; i >= x; i--) {
        xml.writeEndElement();
    }
    for (int i = x; i < elements.size(); i++) {
        xml.writeStartElement(elements.at(i));
    }
    xml.writeCharacters(map_i.value().toString()); prev = elements;
}
for (int i = 0; i < prev.size(); i++) {
    xml.writeEndElement();
}
xml.writeEndElement(); xml.writeEndDocument();
return true;
}

Ответ 4

Чтобы решить эту проблему, у меня есть библиотека файлов конфигурации, над которой я работаю уже несколько лет. Я включил его в несколько программ, и это кажется довольно стабильным. Если кому-то интересно, я могу опубликовать док-документы и/или исходный код doxygen.

Вот раздел документов с обзором:


clsConfigFileBase - базовый класс для объекта доступа к файлам конфигурации

Описание:

clsConfigFileBase является основным механизмом для обработки файлов конфигурации. Чтобы использовать конфигурационную файловую систему, вы необходимо получить класс из clsConfigFileBase и использовать ваш производный класс для:

  • Определите содержимое конфигурационного файла одним или несколькими из следующих способов:

    ConfigValue RegisterConfigValue( QString qstrConfigValueNameIn, 
        QVariant::Type VariantTypeIn )
    
    ConfigValue RegisterConfigValue( QString qstrConfigValueNameIn,
        QVariant::Type VariantTypeIn, QString qstrWhatsThisTextIn )
    
    ConfigValue RegisterConfigValue( clsConfigValueData::ConfigValueSource 
        ConfigValueSourceIn, QString qstrConfigValueNameIn, QVariant::Type 
        VariantTypeIn )
    
    ConfigValue RegisterConfigValue( clsConfigValueData::ConfigValueSource 
        ConfigValueSourceIn, QString qstrConfigValueNameIn, QVariant::Type 
        VariantTypeIn, QString qstrWhatsThisTextIn )
    
    void RegisterConfigValue( ConfigValue ConfigValueIn, QVariant::Type 
        VariantTypeIn )
    
    void RegisterConfigValue( ConfigValue ConfigValueIn, QVariant::Type 
        VariantTypeIn, QString qstrWhatsThisTextIn )
    
    void RegisterConfigValue( const ConfigValue ConfigValueIn, const QString 
        qstrVariantTypeNameIn, const QString qstrWhatsThisTextIn )
    
    DeclareListToLoadAndSave( QString qstrPathConfigValueNameIn, QString 
        qstrConfigValueNameIn )
    
  • Загрузите содержимое файла конфигурации в память одним из следующих способов:

    LoadConfigurationValues()
    
    LoadConfigurationValues(QString qstrConfigFilenameIn)
    
  • Доступ к содержимому конфигурационного файла осуществляется одним из следующих способов:

    getConfigValue( QString qstrConfigValueNameIn )
    
    getBoolConfigValue( QString qstrNameOfConfigValueIn )
    
    getBrushConfigValue( QString qstrNameOfConfigValueIn )
    
    getIntConfigValue( QString qstrNameOfConfigValueIn )
    
    getPaletteConfigValue( QString qstrNameOfConfigValueIn )
    
    getRectConfigValue( QString qstrNameOfConfigValueIn )
    
    getStringConfigValue( QString qstrNameOfConfigValueIn )
    
    getStringListConfigValue( QString qstrNameOfConfigValueIn )
    
  • Задайте значения в файле конфигурации, используя:

    setConfigValue( QString qstrConfigValueNameIn, QVariant variantNewValueIn )
    
  • Сохраните переменные файла конфигурации памяти в файле конфигурации, используя один из следующих способов:

    SaveConfigurationValues()
    
    SaveConfigurationValues(QString qstrConfigFilenameIn)
    
  • Создайте виджеты, которые можно использовать для изменения содержимого значения конфигурации одним из следующих способов:

    CreateCheckBox( QString qstrNameOfConfigValueIn )
    
    CreateComboBox(QString qstrNameOfConfigValueIn, QStringList 
        stringlistComboBoxItemsIn, QLabel * & labelComboBoxOut )
    
    CreateComboBox(QString qstrNameOfConfigValueIn, QStringList 
        stringlistComboBoxItemsIn )
    
    CreateLineEdit( QString qstrNameOfConfigValueIn )
    
    CreateLineEdit( QString qstrNameOfConfigValueIn, QLabel * & labelOut )
    
    CreateLineEdit( QString qstrNameOfConfigValueIn, QHBoxLayout * & layoutOut, 
        QLabel * & labelLineEditLabelOut )
    

clsConfigFileBase предоставляет другие способы управления объектом доступа к конфигурационному файлу, например:

  • clsConfigFileBase::AddItemToStringList(),
  • clsConfigFileBase::getDebugModeIsEnabled(),
  • clsConfigFileBase::getStringConfigValue() и
  • clsConfigFileBase::getTotalConfigValues()

У меня также есть программа для редактирования файлов конфигурации, которая значительно упрощает доступ к вышеуказанной функциональности. Программа редактора файлов конфигурации также имеет документацию по doxygen.

Если у вас есть вопросы, отправьте комментарий.