是否将配置设置保存到QT中的XML文件?
我想将配置设置保存到QT中的XML文件中,并从那里读取它 在QT中实现这一点的最佳方法是什么 非常感谢您的任何样品/想法 谢谢 是XML的Qt示例是否将配置设置保存到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
您还可以使用存储设置。您可以使用注册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;
}