Qt有办法在文件中存储配置设置吗?

时间:2010-10-26 07:34:24

标签: qt file config

是否建议使用Qt以文件(ini或任何其他格式)保存应用程序的设置(如用​​户选择,窗口大小,位置等)?

4 个答案:

答案 0 :(得分:29)

如果您尝试在配置文件中存储自己应用程序的设置,我之前使用过这样的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

答案 1 :(得分:2)

如果您指的是用于编译的配置文件,那么它是项目(专业)文件。 如果您想为自己的程序存储一些设置,可以尝试QSettings。 当然,您可以编写一个类来读/写自己组织的配置文件。

答案 2 :(得分:1)

看看this blog post。我已经使用过它并对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;
}

答案 3 :(得分:1)

为了解决这个问题,我有一个配置文件库,我已经工作了好几年了。我把它合并到了 几个程序,它似乎很稳定。 如果有兴趣我可以发布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 )
    
  7. clsConfigFileBase提供了管理配置文件访问对象的其他方法,例如:

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

    我还有一个配置文件编辑器程序,使上述功能更容易访问。配置文件编辑器程序也有doxygen文档。

    如果您有任何疑问,请发表评论。

相关问题