是否将配置设置保存到QT中的XML文件?

是否将配置设置保存到QT中的XML文件?,qt,configuration,settings,configuration-files,Qt,Configuration,Settings,Configuration Files,我想将配置设置保存到QT中的XML文件中,并从那里读取它 在QT中实现这一点的最佳方法是什么 非常感谢您的任何样品/想法 谢谢 是XML的Qt示例 您还可以使用存储设置。您可以使用注册XML文件格式 这是一个的示例实现,我经常使用For C+来实现这类功能,并极力推荐它。它提供各种格式的序列化,如XML、文本、二进制等 (看起来比实际情况更复杂)下面是我将设置导出为XML的代码。您需要使用opened for write QFile调用exportsetingstoxml()。可以使用导入设置f

我想将配置设置保存到QT中的XML文件中,并从那里读取它

在QT中实现这一点的最佳方法是什么

非常感谢您的任何样品/想法

谢谢

是XML的Qt示例


您还可以使用存储设置。

您可以使用注册XML文件格式


这是一个

的示例实现,我经常使用For C+来实现这类功能,并极力推荐它。它提供各种格式的序列化,如XML、文本、二进制等


(看起来比实际情况更复杂)

下面是我将设置导出为XML的代码。您需要使用opened for write QFile调用
exportsetingstoxml()
。可以使用
导入设置fromXML()
再次导入导出的文件

QString Variant2Text(常量QVariant&value)
{
开关(value.type())
{
大小写QVariant::字符串:
案例QVariant::Int:
案例QVariant::UInt:
案例QVariant::LongLong:
案例QVariant::ULongLong:
案例QVariant::Double:
案例QVariant::Bool:
返回值.toString();
}
QByteArray ba;
save(QDataStream(&ba,QIODevice::WriteOnly));
返回QString(ba.toHex());
}
QVariant Text2Variant(常量QString&sText,QVariant::Type nType)
{
交换机(nType)
{
大小写QVariant::字符串:
案例QVariant::Int:
案例QVariant::UInt:
案例QVariant::LongLong:
案例QVariant::ULongLong:
案例QVariant::Double:
案例QVariant::Bool:
{
qvar(sText);
if(变量转换(nType))
收益var;
返回QVariant(sText);
}
返回QVariant::fromValue(sText);
}
变异值;
load(QDataStream(&QByteArray::fromHex(sText.toLatin1()),QIODevice::ReadOnly));
返回值;
}
无效XmlExportSettingsRecursive(QXmlStreamWriter&writer、QSettings&settings、const QStringList&blackList)
{
QString sGroup=settings.group();
如果(!sGroup.isEmpty())
{
WriteStarteElement(“集团”);
writeAttribute(QStringLiteral(“name”)、sGroup.mid(sGroup.indexOf(QChar(“/”)+1));
}
//首先编写子组
{
const QStringList&listGroups=settings.childGroups();
foreach(常量QString&group,列表组)
{
设置。beginGroup(组);
XmlExportSettingsRecursive(写入程序、设置、黑名单);
settings.endGroup();
}
}
const QStringList&listKeys=settings.childKeys();
foreach(常量QString&key,列表键)
{
if(黑名单包含(键))
继续;
writer.writeStart元素(“键”);
writeAttribute(QStringLiteral(“名称”),键);
const QVariant&value=settings.value(键);
writeAttribute(QStringLiteral(“type”)、value.typeName();
writer.writeCharacters(Variant2Text(value));
writer.writeedelement();
}
如果(!sGroup.isEmpty())
writer.writeedelement();
}
bool XmlImportSettingsRecursive(QXmlStreamReader和reader、QSettings和settings)
{
而(!reader.atEnd()){
reader.readNext();
if(reader.isStartElement())
{           
if(reader.name()==QStringLiteral(“组”))
{
const QXmlStreamAttributes&attr=reader.attributes();
QString sGroup=attr.value(QStringLiteral(“name”)).toString();
settings.beginGroup(sGroup);
如果(!XmlImportSettingsRecursive(读卡器,设置))
返回false;
settings.endGroup();
}
else if(reader.name()==QStringLiteral(“key”))
{
const QXmlStreamAttributes&attr=reader.attributes();
常量QString&sKey=attr.value(qstringlateral(“name”)).toString();
常量QString&sType=attr.value(qstringTerral(“type”)).toString();
if(reader.readNext())
{
if(reader.isCharacters()| | reader.isEndElement())
{
常量QString&sValue=reader.text().toString();
settings.setValue(sKey,Text2Variant(sValue,QVariant::nameToType(sType.toLatin1()));
}
其他的
继续;
}
}
}
else if(reader.isEndElement()&&reader.name()==QStringLiteral(“组”))
返回true;
}
if(reader.hasError()){
qDebug()可读取()
{

qDebug()如果您不一定需要XML,您可以使用QSettings。否则,您需要使用QXmlStreamReader/Writer或QDomDocument来解析和编写XML。@弗兰克:您能给我推荐一些简单的示例来理解QSettings吗?QSettings文档应该包含足够的示例?Qt与自身一起工作时,效果最佳。Boost很好ut集成它将是混乱的,除非它被封装为Qt格式。为什么要引入另一个库依赖项?没错,这是另一个依赖项。这只是我对boost的个人体验。易于使用、快速和boost includes还没有使我的项目混乱。但我想Qsettings会保存在内存中。我想保存一些文件并从中读取它这里…示例实现使用
QXmlStreamWriter
将配置文件保存在
QIODevice
的实例中,该实例通常是
QFile
示例实现根本不适用于QSettings键值对的内部表示形式。例如,如果使用beginWriteArr将数组写入QSettingsay/endArray,writer函数为以数字(Value)开头的数组元素编写了一个格式非常糟糕的XML标记名。这是非法的。到目前为止,我还没有遇到过任何考虑“数组”的读/写XML实现
QString Variant2Text( const QVariant &value )
{
    switch (value.type())
    {
    case QVariant::String:
    case QVariant::Int:
    case QVariant::UInt:
    case QVariant::LongLong:
    case QVariant::ULongLong:
    case QVariant::Double:
    case QVariant::Bool:
        return value.toString();
    }

    QByteArray ba;
    value.save(QDataStream(&ba, QIODevice::WriteOnly));

    return QString(ba.toHex());
}

QVariant Text2Variant( const QString &sText, QVariant::Type nType )
{
    switch (nType)
    {
    case QVariant::String:
    case QVariant::Int:
    case QVariant::UInt:
    case QVariant::LongLong:
    case QVariant::ULongLong:
    case QVariant::Double:
    case QVariant::Bool:
        {
            QVariant var(sText);
            if (var.convert(nType))
                return var;

            return QVariant(sText);
        }
        return QVariant::fromValue(sText);
    }

    QVariant value;
    value.load(QDataStream(&QByteArray::fromHex(sText.toLatin1()), QIODevice::ReadOnly));

    return value;
}

void XmlExportSettingsRecursive(QXmlStreamWriter &writer, QSettings &settings, const QStringList &blackList)
{
    QString sGroup = settings.group();

    if (!sGroup.isEmpty())
    {
        writer.writeStartElement("group");  
        writer.writeAttribute(QStringLiteral("name"), sGroup.mid(sGroup.indexOf(QChar('/')) + 1));
    }
    // Write child groups first
    {
        const QStringList &listGroups = settings.childGroups();
        foreach (const QString &group, listGroups)
        {
            settings.beginGroup(group);         
            XmlExportSettingsRecursive(writer, settings, blackList);
            settings.endGroup();
        }
    }

    const QStringList &listKeys = settings.childKeys();
    foreach (const QString &key, listKeys)
    {
        if (blackList.contains(key))
            continue;

        writer.writeStartElement("key");
        writer.writeAttribute(QStringLiteral("name"), key);
        const QVariant &value = settings.value(key);
        writer.writeAttribute(QStringLiteral("type"), value.typeName());
        writer.writeCharacters(Variant2Text(value));
        writer.writeEndElement();
    }

    if (!sGroup.isEmpty())
        writer.writeEndElement();
}

bool XmlImportSettingsRecursive(QXmlStreamReader &reader, QSettings &settings)
{
    while (!reader.atEnd()) {
        reader.readNext();
        if (reader.isStartElement())
        {           
            if (reader.name() == QStringLiteral("group"))
            {
                const QXmlStreamAttributes &attr = reader.attributes();
                QString sGroup = attr.value(QStringLiteral("name")).toString();

                settings.beginGroup(sGroup);
                if (!XmlImportSettingsRecursive(reader, settings))
                    return false;
                settings.endGroup();
            }
            else if (reader.name() == QStringLiteral("key"))
            {
                const QXmlStreamAttributes &attr = reader.attributes();
                const QString &sKey = attr.value(QStringLiteral("name")).toString();
                const QString &sType = attr.value(QStringLiteral("type")).toString();
                if (reader.readNext())
                {
                    if (reader.isCharacters() || reader.isEndElement())
                    {
                        const QString &sValue = reader.text().toString();
                        settings.setValue(sKey, Text2Variant(sValue, QVariant::nameToType(sType.toLatin1())));
                    }
                    else
                        continue;
                }
            }
        }
        else if (reader.isEndElement() && reader.name() == QStringLiteral("group"))
            return true;
    }
    if (reader.hasError()) {
        qDebug()<<reader.errorString();
        return false;
    }

    return true;
}

bool ExportSettingsToXml( QIODevice *device, const QString &settingsGroup = QString(), const QStringList &blackList = QStringList())
{   
    if (!device || !device->isWritable())
        return false;

    QSettings settings;
    settings.beginGroup(settingsGroup);

    QXmlStreamWriter xmlWriter( device );
    xmlWriter.setAutoFormatting( true );
    xmlWriter.writeStartDocument();

    xmlWriter.writeStartElement( QStringLiteral("settings") );

    if (!settingsGroup.isEmpty())
    {   
        xmlWriter.writeStartElement(QStringLiteral("group"));
        xmlWriter.writeAttribute(QStringLiteral("name"), settingsGroup);
    }

    XmlExportSettingsRecursive(xmlWriter, settings, blackList);

    if (!settingsGroup.isEmpty())
        xmlWriter.writeEndElement();

    xmlWriter.writeEndDocument();

    return true;
}

bool ImportSettingsFromXml( QIODevice *device, const QString &settingsGroup = QString())
{
    if (!device || !device->isReadable())
    {
        qDebug()<<"Trying to import XML settings from non-readable device";
        return false;
    }

    QSettings settings;
    settings.beginGroup(settingsGroup);
    QXmlStreamReader xmlReader( device );
    xmlReader.readNext();
    if (!xmlReader.isStartDocument())
    {
        qDebug()<<"Invalid xml document format";
        return false;
    }

    if (!xmlReader.readNextStartElement())
    {
        qDebug()<<"Empty settings xml document";
        return true;
    }

    if (xmlReader.name() == QStringLiteral("settings") )
    {
        if (!XmlImportSettingsRecursive(xmlReader, settings))
            return false;
    }
    else
    {
        qDebug()<<"Unknown settings format.";
        return false;
    }

    return true;
}