是否建议使用Qt以文件(ini或任何其他格式)保存应用程序的设置(如用户选择,窗口大小,位置等)?
答案 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
派生一个类并使用你的派生类:
使用以下一种或多种方法定义配置文件的内容:
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文档。
如果您有任何疑问,请发表评论。