Есть ли в Qt способ сохранить настройки конфигурации в файле? - PullRequest
15 голосов
/ 26 октября 2010

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

Ответы [ 4 ]

30 голосов
/ 26 октября 2010

Если вы пытаетесь сохранить настройки для вашего собственного приложения в файле конфигурации, я использовал 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

И пример файла config / config.ini:

[some]
config/key=whatever string here
2 голосов
/ 26 октября 2010

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

1 голос
/ 01 марта 2016

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

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


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

Описание:

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

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

    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 )
    
  2. Загрузить содержимое файла конфигурации в память одним из следующих способов:

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

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

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

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

    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.

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

1 голос
/ 01 ноября 2013

Взгляните на это сообщение в блоге .Я использовал его и полностью доволен настройками XML.Методы конструктора и * 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;
}
...